std :: набор шаблонного класса без определенного определения - PullRequest
0 голосов
/ 17 февраля 2012

Предположим, у меня был следующий класс:

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 ]

4 голосов
/ 17 февраля 2012

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

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

1 голос
/ 17 февраля 2012

То, что предлагает Сет, выглядит примерно так:

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...