特定基类的C类模板

新手上路,请多包涵

假设我有课程:

 class Base{};

class A: public Base{
    int i;
};

class B:public Base{
    bool b;
};

现在我想定义一个模板类:

 template < typename T1, typename T2 >
class BasePair{
    T1 first;
    T2 second;
};

但我想定义它,以便只有类 Base 的后代可以用作模板参数。

我怎样才能做到这一点?

原文由 Mat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 667
2 个回答

更确切地说:

 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
}

原文由 user213546 发布,翻译遵循 CC BY-SA 2.5 许可协议

可能不能完全回答这个问题,但除非您 真的需要 使用模板,否则您可以将成员声明为基本类型:

 class BasePair {
    Base first;
    Base second;
};

您将无法将其与无效类型一起使用,并且当您想将其与派生类型一起使用时,您需要将它们强制转换为基本类型:

 A a;
B b;
BasePair basePair;

basePair.first = static_cast<Base>(a);
basePair.second = static_cast<Base>(b);

原文由 Snackoverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题