2016-09-19 80 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

相關問題