2010-01-28 82 views
0

有没有办法来定义模板C++中的模板断言?

assertInheritsFrom<A, B> 

这样

assertsInheritsFrom<A, B> 

编译当且仅当

class A : public B { ... } // struct A is okay too 

谢谢!

+0

附注:*模板*(带有拖尾的s)是更常用的标签。 – 2010-01-28 04:53:52

+0

好的;公认。不会回滚。 – anon 2010-01-28 05:01:11

回答

5

结合静态与is_base_of<Base,Derived>断言从Boost.TypeTraits:

BOOST_STATIC_ASSERT(boost::is_base_of<B, A>::value); 

一个天真的实现(不照顾整型,私人基类和歧义)可能看起来像下面这样:

template<class B, class D> 
struct is_base_of { 
    static yes test(const B&); // will be chosen if B is base of D 
    static no test(...);  // will be chosen otherwise 
    static const D& helper(); 
    static const bool value = 
     sizeof(test(helper())) == sizeof(yes); 
    // true if test(const B&) was chosen 
}; 
+0

你能解释一下这是如何工作的吗? (即如何实现is_base_of,这有点超出我的理解) – anon 2010-01-28 04:53:57

+0

它是一个开源库:http://www.boost.org/doc/libs/1_41_0/libs/type_traits/doc/html/boost_typetraits/reference/ is_base_of.html – 2010-01-28 06:44:58

+1

特拉维斯,这是从答案相同的链接,并没有真正解释它是如何工作的。检查代码也不一定能解释它。有时散文有帮助。但可能不是适合Stack Overflow评论的数量。匿名,如果你试图阅读代码,但仍然不明白,请发布一个关于它的新问题。 (请注意,在Boost的is_base_and_derived.hpp中有一些解释,并带有一些链接。) – 2010-01-28 06:58:53