2016-07-23 4 views
0

質問と同様です。私は、異なるベクトルを管理できる1つの機能を作りたいと思っています。私は継承を使うことを考えました。異なるクラスの引数ベクトルをとる関数のファミリを作る方法は?

ここでは、複数のクラスを操作する必要があります
class A : public C {public: void do();}; 
class B : public C {public: void do();}; 
class C { 
public: 
virtual void do(); 
} 

今、私の機能:Aと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); 

しかし、それはdoesnの仕事はありません。私はこの問題を解決する方法を知らない。テンプレートと

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

なぜテンプレート機能はありませんか? –

+0

私はテンプレートについて何かを読んだが、それをどうやって行うのか分からない。私はそれらを使用しようとします。 –

+1

@FirstStep:彼はテンプレート関数ではないと言っています。彼は彼が問題を解決する方法を知らないと言いました。この解決策は、テンプレート機能である可能性があります。 –

答えて

1

、のようなもの:あなたはあなたが特定のタイプに制限したい場合がありますC.を必要としなかった

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

注意。これは通常、何かのように、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

すばらしい答え、ありがとう –

関連する問題