模板参数约束

时间:2010-08-21 21:04:25

标签: c++ templates inheritance

我一直在阅读this advice about template parameter constraints,并对这一行感到困惑:

template<class T> class Container : Derived_from<T,Mybase> {
    // ...
};

这里发生了什么?这只是普通的旧继承用于使编译器检查Derived_from以执行所需的检查吗?为什么这不会导致为Derived_from生成代码?

感谢。

2 个答案:

答案 0 :(得分:2)

只需查看Derived_from的来源,它与您指向的网址完全相同!

template<class T, class B> struct Derived_from {
    static void constraints(T* p) { B* pb = p; }
    Derived_from() { void(*p)(T*) = constraints; }
};

除了Derived_from构造函数中的单个初始值设定项应该(希望)编译器能够轻松优化之外,您希望生成哪些代码? constraints静态方法只检查指向T的指针是否可以正确分配给指向B的指针 - 当然这应该变成{{{}的纯编译时检查1}}确实来自T,这是我们想要的约束。

答案 1 :(得分:1)

如果执行这些检查的函数只执行那些没有任何副作用的转换,优化器可能会优化整个代码并且不会为函数体生成任何代码。唯一剩下的就是函数符号和返回指令。

事实证明(用GCC 4.5.1测试)甚至不需要发射函数的符号。编译器优化了地址获取,然后观察到该文件中没有其他代码访问该函数,而不是为其发出代码。我认为没关系,因为需要该定义的任何其他翻译单元本身都提供了一个定义 - 所以他们不依赖于其他翻译单元的编译。

请注意,使用此方法时,只有在创建Container<T>对象后才会触发检查。否则,Derived_from的构造函数将永远不会被隐式实例化,并且永远不会进行检查。

有些方法可以在没有任何此类虚拟代码的情况下完成此操作,例如boost::is_base_of