我一直在阅读this advice about template parameter constraints,并对这一行感到困惑:
template<class T> class Container : Derived_from<T,Mybase> {
// ...
};
这里发生了什么?这只是普通的旧继承用于使编译器检查Derived_from
以执行所需的检查吗?为什么这不会导致为Derived_from
生成代码?
感谢。
答案 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
。