在我使用元编程技术的一些代码中,我们使用模板化参数,这些参数被转发到其他地方并随后进行转换,因此我们实际上从未创建其中一些类的实例。
特别是,我们使用 std::vector<T>
其中 T 没有包含在 vector 中的语义。实际上,尽管我们创建了一个 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 是不可复制的,所以它是 vector 的无效类型。
现在代码在我使用过的任何编译器上都可以正常编译,但我想知道它是否是有效的 C++(并且在 C++11 及更高版本中将继续如此)。
我可能应该补充一点,Bar 实际上可能是抽象的(而且通常会是)。目的是表明该参数是这些参数的集合(在某种意义上是 Java/C# 引用的风格)。
最佳答案
只要您不实例化类型,技术上就没问题,与例如不完整类型。
但是,这是一个糟糕的设计。
所有这些扭曲使得使用更多按键来编写误导性的东西成为可能,而不仅仅是传递参数。
我会重新考虑那个设计。
例如做
typedef Builder1Param< FooInterface, Foo, std::vector, Bar > FooBuilder;
对于模板定义部分,std::vector
在这里是模板模板参数。
关于使用 "invalid"模板参数的 C++ 元编程 - 允许吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12423460/