2012-02-17 5 views
0

Предположим, что я имел следующий класс:станд :: набор шаблона класса без конкретного определения

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>, сохраненными в том же наборе).

ответ

4

Вы не можете, потому что Value<T> и Value<X> полностью и совершенно разные и почти несвязанные типы, как int и string (когда T != X). В вашем случае они очень разные, потому что они фактически хранят в себе T, а это означает, что если разные T s имеют разные размеры, то Value<T> s будут разных размеров. (Это не причины, это просто причина.)

Вы можете попробовать использовать полиморфизм, что делает Value<T> наследовать от базового класса, так что вы можете хранить указатели на этот базовый класс, который может быть направлен на a Value<T> внизу, где T - любой тип, поддерживаемый вашим шаблоном.

1

Что говорит Сет-то вроде этого:

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)); 
}