0

我想确保在以下模板化类 B 的定义中,类 A 派生自抽象类 C。我可以这样做吗?

template <class A>
class B {
    // A must derive from C
    ...
};

我正在使用 C++11。

4

2 回答 2

4

使用std::is_base_of

template <class A>
class B {
    static_assert(std::is_base_of<C, A>::value
                  , "A must derive from C");
    //...
};

请注意,这is_base_of<C, C>::value是真的,因此您可能还想使用std::is_sameto ensure Ais not 实际上C本身:

static_assert(std::is_base_of<C, A>::value && !std::is_same<C, A>::value
              , "A must derive from C");
于 2013-07-31T18:47:39.280 回答
0

总的来说,这是一个SFINAE问题。

在 C++11 中有更好的方法,但如果你使用的是 C++03,你可以尝试这样的事情:

template <class A>
class B {
public:
    B() { dummy((A*)0); }

private:
    void dummy(C *test) {}
};

也就是说,添加采用类型指针的虚拟函数C。然后从您的构造函数调用它,其值为 type A*。这不能为A不派生自的类型编译C

于 2013-07-31T18:58:34.053 回答