【发布时间】:2012-12-21 16:03:43
【问题描述】:
我开始使用 C++ 模板只是因为我想了解与其他语言 (Java) 的具体差异,并且我达到了它们开始分歧的地步,但我不知道我应该如何解决具体问题问题(或解决它)。
假设我有一个通用值类,例如
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 类定义,这只不过是 typedef @ 987654324@到底)
比方说,是否有可能拥有一个能够存储指向Value 实例的任意指针的集合?无需指定泛型类的具体具体类型。
据我了解,模板只是一个编译时问题,编译器会分析使用模板的所有具体类型,并为它们中的每一个编译相同方法的不同版本,因此我正在尝试做似乎不可能(而在 Java 中,我可以使用通配符来表示 List<Value<?>> 之类的东西)。我错了吗?
是否有一个通用的设计来解决这个问题,或者我不得不放弃模板来实现它?
【问题讨论】:
-
是的,让
Value继承自一个通用类型。