他の言語(Java)との特定の違いを理解したかったという理由だけで、C ++テンプレートの使用を開始し、それらが分岐し始めたが、特定の問題を解決する方法がわかりません(またはそれを回避する)。
ジェネリック値クラスがあるとします。
template <class T>
class Value
{
protected:
T value;
public:
Value(Type type, T value) : type(type), value(value) {}
void set(T value) { this->value = value; }
T get() const { return this->value; }
T clone() { return new Value<T>(type, value); }
virtual string svalue() const = 0;
const Type type;
};
および特定のサブタイプ:
class Int : public Value<int>
{
public:
Int(int value) : Value<int>(INT, value) { };
virtual string svalue() const { ... }
friend ostream& operator<<(ostream& os, const Int& v);
};
(を使用して型固有のコードを指定することも可能ですtemplate <>
が、それを理解するにはまだ十分に使用する必要があるため、今のところ、独自のIntクラスで定義しました。これはValue<int>
、最終的にはtypedefにすぎません)
Value
たとえば、インスタンスへの任意のポインタを格納できるコレクションを持つことは可能ですか?ジェネリッククラスの特定の具象型を指定する必要はありません。
私が理解していることから、テンプレートはコンパイル時の問題であり、コンパイラはテンプレートが使用されるすべての具体的なタイプを分析し、それぞれに対して同じメソッドの異なるバージョンをコンパイルします。したがって、私がやろうとしていることはしません。可能のようです(Javaでは、のようなものにワイルドカードを使用できますList<Value<?>>
)。私が間違っている?
この問題を解決するための一般的な設計はありますか、それともそれを達成するためにテンプレートを削除する必要がありますか?