2016-09-19 97 views
-1

如何解决以下冲突?定义将抽象类的所有派生类作为参数的函数

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

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

经过一段时间,我意识到我可以enable_if参数有一定的特质,并简单地摆脱了抽象类。有其他可能的解决方案吗?

代码:

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); 
} 
+0

** - 1 **这是**不是真实的代码**。 –

+0

“下面的代码完全不起作用” - 不是很大一部分是由于语法错误,逻辑错误和缺失标识符过多造成的。给自己一个战斗机会,并至少解决这些问题。 – WhozCraig

+0

我认为如果愚蠢的非实际代码示例被忽略,这可以归结为协变函数模板的问题,C++不支持它作为成员函数。 –

回答

1

如果你想要一个错误(因此不SFINAE),你还不如用:

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

在功能

+0

我不想要一个错误。但感谢您的答案。我不知道is_base_of。 – rxu

+0

@rxu:请注意,如果它不是基础,则会出现错误。或者你想在这种情况下有不同的超载? – lorro

相关问题