我想检查给予模板的类型是否继承自项目中的基类.
它应该像以下示例中所期望的那样工作:
template< class T : public CBaseClass >
Run Code Online (Sandbox Code Playgroud)
Fre*_*urk 14
以下是Stroustrup的一个例子:
template<class Test, class Base>
struct AssertSameOrDerivedFrom {
AssertSameOrDerivedFrom() { &constraints; }
public:
static void constraints() {
Test *pd = 0;
Base *pb = pd;
}
};
template<class T>
struct YourClass {
YourClass() {
AssertSameOrDerivedFrom<T, CBaseClass>();
}
};
Run Code Online (Sandbox Code Playgroud)
在C++ 0x中,这变为:
template<class T>
struct YourClass {
static_assert(std::is_base_of<CBaseClass, T>::value);
};
Run Code Online (Sandbox Code Playgroud)
Jer*_*ock 12
你可以使用boost::is_base_and_derivedBoost,结合使用BOOST_STATIC_ASSERT.如果您使用的是支持TR1或C++ 0x的编译器,那么标准库中的这些构造就等价(std :: is_base_of,C++ 0x中的static_assert语句).
如果你想断言,那就去做Nurk吧.如果要检查,请使用boost或C++ 0x中的is_base_of.如果您不能使用其中任何一种,请使用SFINAE:
template < typename Base, typename PotentialDerived >
struct is_base
{
typedef char (&no) [1];
typedef char (&yes) [2];
static yes check(Base*);
static no check(...);
enum { value = sizeof(check(static_cast<PotentialDerived*>(0))) == sizeof(yes) };
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6593 次 |
| 最近记录: |