Template
テンプレート値を格納できるC++クラスを作成しようとしています。ただし、テンプレート値のタイプを知る前に、このクラスへのポインターを作成する必要があります。これを行うためにBase
、テンプレートクラスが継承する抽象クラスを作成しました。へのポインタを作成しBase
、それらが割り当てられるときに、を使用しますbasePtr = new Template<TYPE>
。
ここでの問題は、に値を割り当てることですTemplate
。私がそうすることを考えることができるすべての方法(私はオーバーロードされた代入演算子を使用したいと思います)は、正式なパラメーターとしてテンプレートデータ型を持つメソッドを必要とします。Template
オブジェクトにはポインタを介してのみアクセスできるためBase
、で仮想関数を作成する必要がありますBase
。ただし、仮想メソッドにテンプレートデータ型を含めることはできません。また、Base
署名の仮想メソッドは、のメソッドの仮想メソッドと一致する必要がありTemplate
ます。
これが私がしようとしていることの例です:
class Base {
public:
/* THIS IS ILLEGAL - can't have template virtual method
template <class V>
virtual void operator =(const V& newValue) = 0;
*/
};
template <class ValueType>
class Template : public Base {
private:
ValueType *value;
public:
void operator =(const ValueType& newValue) {
*value = newValue;
}
};
int main() {
Base *theObject; // Datatype for template not known
theObject = new Template<string>; // At this point, it will be known
// NOW, THIS DOESN'T WORK - no virtual assignment overload in Base
*theObject = "Hello, world!";
return 0;
}
私がこれを完全に間違った方法で行っている場合、そして私の方法が愚かである場合、私は謝罪します-これは本当のOODへの私の最初の進出です。私が見ないこの問題を回避する方法はありますか?Base
次のように、代入演算子をさまざまな入力タイプでオーバーロードする純粋仮想関数の長いリストを作成できることはわかっています。
virtual void operator =(const string& newValue) = 0;
virtual void operator =(const int& newValue) = 0;
virtual void operator =(const long& newValue) = 0;
...
しかし、ユーザーがカスタムクラスオブジェクト(または、より可能性が高いのはそれらのオブジェクトへのポインター)をに挿入できるようにしたいのでTemplate::value
、上記の方法で実行できる方法はありません。