使用 "invalid"模板参数的 C++ 元编程 - 允许吗?

标签 c++ c++11 metaprogramming

在我使用元编程技术的一些代码中,我们使用模板化参数,这些参数被转发到其他地方并随后进行转换,因此我们实际上从未创建其中一些类的实例。

特别是,我们使用 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/

相关文章:

c++ - 双向链表无限循环?

c++11数组传递给函数错误

c++ - 为什么 std::copy_n 采用模板参数而不是 std::size_t?

parsing - F# 中的事件模式的递归如何工作?

Ruby:将 block 传递给定义实例方法的类宏

c++ - 使用多个头文件和 cpp 文件帮助

c++ - 如何最小化 USB 2 的延迟

c++ - 为什么必须在父类(super class)中实现虚函数?

c++ - 没有 lpthread 的 Promise 中出现未知异常的原因

Python - 如果函数是一等对象,函数可以有方法吗?