在我使用元编程技术的一些代码中,我们使用模板化的参数,这些参数会被转发到其他地方并随后进行转换,因此我们从未真正创建其中一些类的实例。
特别是,我们使用std::vector<T>
where 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 知道它将传递 a vector<shared_ptr<Bar> >
toFoo
而不是 a vector<Bar>
. 问题是因为 Bar 是不可复制的,所以它是向量的无效类型。
现在代码在我使用过的任何编译器上都可以正常编译,但我想知道它是否是有效的 C++(并且将继续在 C++11 及更高版本中如此)。
我可能应该补充一点, Bar 实际上可能是抽象的(而且经常是抽象的)。目的是表明参数是这些参数的集合(在某种意义上是 Java/C# 引用的风格)。