如何为具有通用模板的类重载运算符?

时间:2015-06-22 15:18:57

标签: c++ class

假设我们有一些模板化的B类:

template<class T>
class B {
public:
    B(void) { (void)static_cast<C*>((T*)0) }
    ~B(void) {}
    unsigned as_int(void) { return this->internal_state; }
private:
    unsigned internal_state;
}

其模板接受C类及其派生类(由于上面构造函数中的静态强制转换):

class C {
    //something
}

class D
    : public C {
    //something
}

如果我们有第三类A:

class A {
public:
    A(void) { //something };
    ~A(void) { //something };

    inline A& operator = (B<C>& rhs) { this->internal_state = rhs.as_int(); }
    inline A& operator = (B<D>& rhs) { this->internal_state = rhs.as_int(); }
private:
    unsigned internal_state;
}

我想要做的是提供赋值运算符的重载,它接受B类作为右侧。在上面的代码片段中,这个工作正常,但是只有我分别为B的每个模板(B,B等)重载。是否有可能为某些通用B重载一次

1 个答案:

答案 0 :(得分:2)

两条评论。首先,如果你想要只在C和它的孩子上模仿B,你应该只做一个static_assert:

std::static_assert(std::is_base_of<C, T>::value, "Error: T not child of C!")

其次,您确实可以编写一个泛型赋值运算符,如anxieux建议的那样:

template <typename T>
A& operator= (B<T> & rhs) { ... } // inline implied inside class declaration