假设我有以下课程:
template<typename T>
class Value {
public:
Value(std::string name, T value) : name(name), value(value) { }
T const &value() throw() { return value }
std::string const &name() throw() { return name }
private:
std::string name;
T value;
};
然后我想做类似的事情:
class Group {
public:
Group(std::string name) : name(name) { }
template<typename T>
void add_value(std::string const &name, T const &val) throw() {
Value<T> tmp(name, val);
values.insert(tmp);
return;
}
private:
std::string name;
std::set< Value<????> > values; // HERE BE MY QUESTION
}
具体来说,我想将Value
存储在同一个std :: set中的许多模板表单中(比如,Value<int>
和Value<float>
存储在同一个集合中。
答案 0 :(得分:4)
您不能因为Value<T>
和Value<X>
完全不同且几乎不相关的类型,例如int
和string
(T != X
时)。在您的情况下,它们是非常不同的,因为它们实际上存储了T
,这意味着如果不同的T
是不同的大小,Value<T>
将是不同的大小。 (那不是 的原因,只是 的原因。)
您可能想尝试使用多态,使Value<T>
从基类继承,以便您可以存储指向该基类的指针,该基类可以指向下面的Value<T>
,其中T
}是您的模板支持的任何类型。
答案 1 :(得分:1)
Seth建议的是这样的:
class Base {
virtual ~Base() {}
};
template <typename T> class Value: public Base {
}
int main() {
Set<Base*> base_set;
base_set.add(new Value<int>(1));
base_set.add(new Value<string>(1));
}