Mat*_*Mat 45 c++ generics inheritance templates
假设我有课程:
class Base{};
class A: public Base{
int i;
};
class B:public Base{
bool b;
};
Run Code Online (Sandbox Code Playgroud)
现在我想定义一个模板化的类:
template < typename T1, typename T2 >
class BasePair{
T1 first;
T2 second;
};
Run Code Online (Sandbox Code Playgroud)
但我想定义它,只有类Base的后代可以用作模板参数.
我怎样才能做到这一点?
Has*_*own 44
C++ 11介绍 <type_traits>
template <typename T1, typename T2>
class BasePair{
static_assert(std::is_base_of<Base, T1>::value, "T1 must derive from Base");
static_assert(std::is_base_of<Base, T2>::value, "T2 must derive from Base");
T1 first;
T2 second;
};
Run Code Online (Sandbox Code Playgroud)
小智 12
更确切地说:
class B {};
class D1 : public B {};
class D2 : public B {};
class U {};
template <class X, class Y> class P {
X x;
Y y;
public:
P() {
(void)static_cast<B*>((X*)0);
(void)static_cast<B*>((Y*)0);
}
};
int main() {
P<D1, D2> ok;
P<U, U> nok; //error
}
Run Code Online (Sandbox Code Playgroud)
C++还没有直接允许这个.您可以通过在类中使用STATIC_ASSERT和类型检查来间接实现它:
template < typename T1, typename T2 >
class BasePair{
BOOST_STATIC_ASSERT(boost::is_base_of<Base, T1>);
BOOST_STATIC_ASSERT(boost::is_base_of<Base, T2>);
T1 first;
T2 second;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24037 次 |
| 最近记录: |