定义将Abstract类的所有派生类作为参数的函数

时间:2016-09-19 19:38:53

标签: c++ abstract-class

如何解决以下冲突?

  1. 在Abstract中定义一个返回Abstract的operator []。我想允许函数f使用该方法。但是,这不会起作用,因为DerivedA的相应运算符[]应该返回DerivedA。然后,Abstract的operator []的返回类型和DerivedA的operator []的返回类型不是协变的。

  2. 未在Abstract中定义方法。现在函数f不能构建在Abstract的方法上。可能这意味着必须为Abstract的所有派生类中的每一个编写多个版本的f。

  3. 过了一会儿,我意识到我可以启用_如果参数有一定的特性,只需摆脱抽象类。还有其他可能的解决方案吗?

    代码:

    class Abstract{
        protected:
            int val;
        public:
            //virtual Abstract operator[](int i){} //forget about this.
            virtual ~Abstract(){}
    };
    
    class DerivedA : public Abstract{
        public:
            DerivedA(){
                val = 0;
            }
            DerivedA operator[](int i){
                DerivedA temp;
                temp.val = val + i;
            }
    };
    class DerivedB : public Abstract{
        public:
            DerivedB(){
                val = 0;
            }
            DerivedB operator[](int i){
                DerivedB temp;
                temp.val = val*2 + i;
            }
    };
    
    template <typename T>
    //some enable_if here to limit type T to
    //DerivedA or DerivedB.
    T f(T & X){
        return X[1];
    }
    
    /*
    Abstract f(Abstract & X){
        return X[1];
    } //forget about this again. 
    */
    
    int main(void){
        DerivedB B;
        DerivedA A;
        f(B);
        f(A);
    }
    

1 个答案:

答案 0 :(得分:1)

如果您想要错误(因此不是SFINAE),您也可以使用:

static_assert(std::is_base_of<Abstract, T>, "Error: not a descendant");

在你的功能中。