2016-07-23 25 views
0

正如在問題中。我想做一個能夠管理不同向量的函數。我想過使用繼承。如何創建一個函數族,將其作爲不同類的向量參數?

class A : public C {public: void do();}; 
class B : public C {public: void do();}; 
class C { 
public: 
virtual void do(); 
} 

現在我的功能,應多班工作,在這裏:一個在我的節目B

void function(vector<C*>* array) { 
    for (int i = 0; i < array->size(); i++) { 
     array->at(i)->do(); 
    } 
} 

,我用這個函數那樣:

vector<A*>* array = new vector<A*>(); 
array->push_back(new A()); 
function(array); 

但它不沒有工作。我不知道如何解決這個問題。

The Visual Studio reports that it cannot convert from vector<A*>* to vector<C*>* 
+0

那麼爲什麼不能模板功能? –

+0

我看了一些關於模板的內容,但我不知道該怎麼做。我會嘗試使用它們。 –

+1

@FirstStep:他沒有說過沒有模板功能。他說他不知道如何解決這個問題。解決方案很可能是一個模板功能。 –

回答

1

有了模板,一樣的東西:

template<typename T> 
void function(vector<T*>* array) { 
    for (int i = 0; i < array->size(); i++) { 
     array->at(i)->do(); 
    } 
} 

請注意,您並不需要C.你可能希望限制對特定類型。這通常是通過std::enable_if<>做,是這樣的:

template<typename T> 
typename std::enable_if< std::is_same<T, A>::value 
         || std::is_same<T, B>::value, void >::type function(vector<T*>* array) { /... 

使用std::is_same<>,如果你想檢查精確匹配,std::is_base_of<>如果您能夠接受繼承類型。

+0

很好的答案,謝謝 –

相關問題