Контейнер STL с общими / шаблонными переменными - PullRequest
3 голосов
/ 29 января 2011

Я просто хотел бы сделать что-то из следующего:

template <typename T>
class gvar {
private:
    T var;
public:
    gvar(T var) : var(var) {}
};

std::stack<gvar> some_stack;

g ++ выдает все виды ошибок о том, что gvar не является типом.Это достижимо относительно легким способом?Я предпочитаю не использовать boost :: any / boost :: option.

edit:

Чтобы уточнить, что я хочу:

Std :: stack, который может содержатьпеременные разных типов (просто примитивы это нормально).

Ответы [ 7 ]

7 голосов
/ 29 января 2011

Поскольку gvar не тип, это шаблон типа. Вам необходимо указать аргумент шаблона для него:

std::stack< gvar<int> > some_stack;
5 голосов
/ 29 января 2011

Вы должны либо создать экземпляр класса шаблона, либо подойти к этому как-то иначе. Например, вы можете сделать std::stack<gvar<int> > или попробовать такие решения, как Boost :: Any .

3 голосов
/ 29 января 2011

Вам просто нужно указать, какой тип создавать gvar, например:

std::stack<gvar<int> > some_stack;
2 голосов
/ 29 января 2011

В общем, если вы хотите полиморфизм, вы должны использовать базовый класс:

class GVarBase
{
public:
  virtual ~GVarBase() {}
};

template <typename T>
class GVar: public GVarBase
{
public:
private:
  T mVar;
};

std::stack< std::unique_ptr<GVarBase> > stack;

Обратите внимание, что с вашим текущим кодом даже std::stack< GVar<int> > не будет работать, необходим конструктор по умолчанию.

1 голос
/ 29 января 2011

Нет. Там нет никакого способа сделать то, что вы пытаетесь сделать. Больше ясности в проблеме, которую вы пытаетесь решить с помощью этой попытки, может позволить мне предложить обходной путь.

1 голос
/ 29 января 2011

Если вы можете страдать с ограниченным диапазоном, то есть вы хорошо знаете длину коллекции, которую вы можете посмотреть, используя кортежи .Конечно, вам также нужно знать тип заранее.

boost::tuple<gvar<double>,gvar<int>,gvar<double> > myItems;

Что в вашем случае, вероятно, лучше всего выразить просто:

0 голосов
/ 30 января 2011

Кажется, вам нужно что-то вроде этого:

class gvar {
        struct base_val { 
                virtual ~base_val() {} 
        };
        template <class T>
        struct con_value : base_val{
                con_value(T val): value(val) {}
                T value; 
        };      
        base_val *var;
public:
        template <typename T>
        gvar(T var) : var(new con_value<T>(var)) {}
        template <typename T>
        T* getValue() { 
                con_value<T> *ptr = dynamic_cast<con_value<T>*>(var);
                if(ptr == NULL) return NULL;
                return &ptr->value;
        }
};

std::stack<gvar> some_stack;

(ссылка на ideone с рабочим примером http://www.ideone.com/gVoLh)

Это упрощенно boost::any, поэтому, если вы можете, просто используйте boost::any вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...