メタプログラミング手法を使用するコードの一部では、他の場所に転送されて後で変換されるテンプレート化された引数を使用するため、これらのクラスの一部のインスタンスを実際に作成することはありません。
特に、std::vector<T>
Tにベクトルに含まれるセマンティクスがない場合に使用します。実際には、を作成しますがstd::vector<shared_ptr<T> >
。
コードは次のようになります。
class Bar : noncopyable
{
// whatever
};
class Foo : public FooInterface
{
public:
explicit Foo( std::vector< shared_ptr<Bar> > );
};
typedef Builder1Param< FooInterface, Foo, std::vector<Bar> > FooBuilder;
FooBuilderは、巧妙なメタプログラミング手法により、をではvector<shared_ptr<Bar> >
なくFoo
に渡すことを認識していvector<Bar>
ます。問題は、Barはコピーできないため、ベクトルに対して無効な型であるということです。
これで、コードはこれを使用したすべてのコンパイラで正常にコンパイルされますが、有効なC ++であるかどうかを知りたいです(C ++ 11以降でも引き続き有効です)。
私はおそらく、バーが実際には抽象的である可能性があることを追加する必要があります(そしてしばしばそうなるでしょう)。目的は、パラメーターがこれらのコレクションであることを示すことです(ある意味では、Java / C#参照のスタイルで)。