特定基类的C++类模板

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)


Kon*_*lph 9

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)

  • 关键词是"尚未".为了从搜索引擎到达这里的其他人的利益,`static_assert`和`is_base_of`毕业于C++ 11中的官方语言功能.与公认的答案相比,它们可以制作更直观/更可怕的代码. (3认同)