有没有办法来定义模板C++中的模板断言?
assertInheritsFrom<A, B>
这样
assertsInheritsFrom<A, B>
编译当且仅当
class A : public B { ... } // struct A is okay too
谢谢!
有没有办法来定义模板C++中的模板断言?
assertInheritsFrom<A, B>
这样
assertsInheritsFrom<A, B>
编译当且仅当
class A : public B { ... } // struct A is okay too
谢谢!
您可以从Alexandrescu的书中阅读此部分Detecting convertibility and inheritance at compile time。
编辑:还有一个链接一样:http://www.ddj.com/cpp/184403750查找检测兑换和继承
您能否在此提供摘要? Google只会经常提供一本书,然后暂时阻止其他人。 – 2010-01-28 06:43:47
实现它;作品完美无瑕。 – anon 2010-01-28 10:38:56
结合静态与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
};
你能解释一下这是如何工作的吗? (即如何实现is_base_of,这有点超出我的理解) – anon 2010-01-28 04:53:57
它是一个开源库: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
特拉维斯,这是从答案相同的链接,并没有真正解释它是如何工作的。检查代码也不一定能解释它。有时散文有帮助。但可能不是适合Stack Overflow评论的数量。匿名,如果你试图阅读代码,但仍然不明白,请发布一个关于它的新问题。 (请注意,在Boost的is_base_and_derived.hpp中有一些解释,并带有一些链接。) – 2010-01-28 06:58:53
您可能还需要阅读从Bjarne的Stroustrup的C++ FAQ此项:Why can't I define constraints for my template parameters?(答案是,你可以,他提供了一个示例,说明如何实现约束。)
附注:*模板*(带有拖尾的s)是更常用的标签。 – 2010-01-28 04:53:52
好的;公认。不会回滚。 – anon 2010-01-28 05:01:11