私は、C++、特にC++ 11の組み込み機能を最大限に活用しようとしている機械学習ライブラリを構築しています。私はTransformations
と呼ばれる入力の変更を行うさまざまなクラスを持っています。今度は、パイプラインを構築して、それらを連鎖していきたい(そして最終的には、クラスファイヤーや回帰機のような機械学習アルゴリズムをチェーンの最後に持つ)。左辺値と右辺値を持つVariadicテンプレートクラスコンストラクタ
バリデーションテンプレートパラメータを持つクラスは、このユースケースには完全にマッチしていると思います。そのことは、コンストラクタでrvalueとlvaluesの両方を受け入れることです。
右値の場合は移動したいが、左辺値の場合は参照を保持したい(ただしこれは100%確かではないいくつかのスコープにバインドされ、関数の結果としてパイプラインを返すことは爆発するだろうが、このライブラリのpurporsesのためにこれはちょうど文書化することができる)。
これは、クラスのようになります。
template <class... Ts>
class Pipeline {
};
template <class T, class... Ts>
class Pipeline<T, Ts...> {
public:
Pipeline(T?? transformation, Ts ??... following) : Pipeline<Ts...>(following...), _transformation(???) {}
...
}
_transformation
は、初期化リストでstd::move
にするかどうか、どのようなコンストラクタでタイプT
とTs
する必要があり、参照するかどうかはわかりません。
編集:左辺値の場合、パイプラインは変換を変更できるため、左辺値の場合は非constにする必要があります。
典型的な標準ライブラリアプローチはすべてをコピーすることです。参照セマンティクスを必要とするユーザーは 'reference_wrapper'を使用できます。 –