Хранение нескольких типов шаблонного класса в контейнере - PullRequest
1 голос
/ 10 ноября 2011

Если у меня есть класс с шаблоном:

template<typename T>
class foo{
    T m_a;

    foo(T a){
        m_a = a;
    };

    ~foo(){

    };
};

Есть ли способ сохранить несколько вариантов этого?

Например, вектор, который может хранить указатель на foo< int > и foo< string > одновременно?

Изменить дополнительную информацию

Я хочу скрыть реализацию этого:

EventListener<string> ev1;
EventListener<int, int> ev2;
EventListener<int, string, double> ev3;

ev1(&Events::nameChange, &nameChangeCallback);
ev2(&Events::healthChange, &healthChangeCallback);
ev3(&Events::newUser, &newUserCallback);

ev1.processEvents();
ev2.processEvents();
ev3.processEvents();

вэто:

EventManager em;
em.listen(&Events::nameChange, &nameChangeCallback);
em.listen(&Events::healthChange, &healthChangeCallback);
em.listen(&Events::newUser, &newUserCallback);
em.processEvents();

EventManager необходимо создать и сохранить EventListeners в векторе, чтобы иметь возможность запомнить их и удалить их в деструкторе.

Вот где я застрял.

Ответы [ 2 ]

6 голосов
/ 10 ноября 2011

Если вы хотите, например, std::vector<foo<T>*>, тогда вам нужно использовать базовый класс без шаблонов. Для этого потребуется использовать динамическую диспетчеризацию, поэтому весь открытый интерфейс должен быть объявлен virtual.

struct foo_base {
    virtual ~foo_base() {}
    virtual void something() = 0;
};

template <typename T>
struct foo : foo_base {
    // ...
    void something() { /* do something with T */ }
};

Тогда ваш контейнер std::vector<foo_base*>. Другой, возможно, лучший способ - использовать boost::variant. Это ограничивает количество типов, которые вы можете хранить, но в то же время не требует базового класса и виртуального интерфейса.

typedef boost::variant<foo<int>, foo<std::string>> foo_variants;
std::vector<foo_variants> v;

Третий способ - использовать boost::any, но для этого потребуется boost::any_cast, где бы вы его не использовали, и разрешить хранить в векторе абсолютно все.

std::vector<boost::any> v;
1 голос
/ 10 ноября 2011

Различные экземпляры шаблона класса - это разные (с точки зрения компилятора, совершенно не связанные) типы, поэтому этот вопрос применим.

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