如何验证模板类是否在编译时从给定的类派生?

时间:2011-05-05 18:52:49

标签: c++ templates inheritance compiler-errors

我想知道,是否有任何优雅的方式(如this)来检查模板参数是否来自给定的类? 一般来说:

template<class A, class B>
class MyClass
{
    // shold give the compilation error if B is not derived from A
    // but should work if B inherits from A as private
}

另一个question中提供的解决方案仅在B从A继承为public时才起作用:

class B: public A

然而,我宁愿没有这样的约束:

class A{};
class B : public A{};
class C : private A{};
class D;
MyClass<A,B> // works now
MyClass<A,C> // should be OK
MyClass<A,D> // only here I need a compile error

提前致谢!!!

2 个答案:

答案 0 :(得分:7)

你可以尝试我在这里说的话: C++: specifying a base class for a template parameter 在静态断言(C ++ 0x或BOOST_STATIC_ASSERT)

template<class A, class B> 
class MyClass 
{ 
  static_assert( boost::is_base_of<A,B>::value );
}

答案 1 :(得分:1)

私有地继承任何东西是一个实现细节。

在重构和代码分析期间,如果对外部功能无法进行此类检测,我会更高兴...