std ::没有特定定义的模板类集

时间:2012-02-17 01:35:07

标签: c++ oop

假设我有以下课程:

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>存储在同一个集合中。

2 个答案:

答案 0 :(得分:4)

您不能因为Value<T>Value<X>完全不同且几乎不相关的类型,例如intstringT != 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));
}