C++ 模板参数约束

C++ 模板参数约束,c++,templates,inheritance,C++,Templates,Inheritance,我一直在通读,被这句话弄糊涂了: template<class T> class Container : Derived_from<T,Mybase> { // ... }; 模板类容器:派生自{ // ... }; 这是怎么回事?这仅仅是一个普通的旧继承,用于让编译器检查派生自以执行所需的检查吗?为什么这不会导致为从派生的生成代码 谢谢。只需查看源于的的源代码,它与您指向的URL完全相同 template<class T, class B> st

我一直在通读,被这句话弄糊涂了:

template<class T> class Container : Derived_from<T,Mybase> {
    // ...
};
模板类容器:派生自{
// ...
};
这是怎么回事?这仅仅是一个普通的旧继承,用于让编译器检查
派生自
以执行所需的检查吗?为什么这不会导致为从派生的
生成代码


谢谢。

只需查看源于
的源代码,它与您指向的URL完全相同

template<class T, class B> struct Derived_from {
    static void constraints(T* p) { B* pb = p; }
    Derived_from() { void(*p)(T*) = constraints; }
};
template struct派生自{
静态空洞约束(T*p){B*pb=p;}
派生自(){void(*p)(T*)=约束;}
};

除了
中从
的构造函数派生出的单个初始值设定项(希望编译器能够轻松优化),您还希望生成什么代码?而
约束
静态方法只是检查指向
T
的指针是否可以正确地分配给指向
B
的指针——这当然应该变成一个纯粹的编译时检查,
T
确实是从
B
派生的,这就是我们所需要的约束。

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

事实证明(使用GCC 4.5.1进行测试),甚至不需要发出函数的符号。编译器优化了地址获取,然后发现该文件中没有其他代码访问该函数,也没有为其发出代码。我认为这没关系,因为任何其他需要该定义的翻译单元都会自己提供一个定义,所以它们不依赖于其他翻译单元的编译

请注意,使用此方法,检查仅在创建
容器的对象时触发。否则,从
派生的
的构造函数将永远不会隐式实例化,也永远不会进行检查

有一些方法可以在没有任何此类伪代码的情况下完全实现这一点,比如
boost::is_base_of