Параметры шаблона вариативного шаблона C ++ 11

Сохраняем старый вопрос. См. Разрешение ниже. Это наверное что-то простое, но все же. У меня есть следующий фрагмент кода C ++ 11:

#include <vector>

template <typename... Ts>
struct typelist
{
};

template <typename T>
struct EventContainer
{
    typedef T Type;
    /// TODO. Ring buffer
    std::vector<T> container;

    void push(const T& t)
    {
        EventContainer<T>::container.push_back(t);
    }

    virtual ~EventContainer()
    {
    }
};


template <template <typename...> class TL>
class EventStorage:
        public EventContainer<Ts>...
{

};

class Event1
{
};

class Event2
{
};

typedef typelist<Event1,Event2> Events12;

int main()
{
    EventStorage<Events12> ev;

    return 0;
}

Как я могу заставить EventStorage унаследовать EventContainer , привязанный к каждому из типов в списке типов . Я мог бы сделать это с помощью Loki :: library, но я хочу использовать C ++ 11 с вариативными шаблонами. Спасибо.

Решение 1. Устранение проблемы с шаблоном шаблона EventStorage . Это сделает EventStorage , множественное наследование всех EventContainer шаблонов с каждым типом Ts .

template <typename...>
class EventStorage
{
};

template <typename... Ts>
class EventStorage < typelist<Ts...> >:
        public EventContainer<Ts>...
{

};

Теперь у меня ошибка времени компиляции на следующем main () :

int main()
{
    EventStorage<Events12> ev;
    Event1 ev1;
    ev.push(ev1);

    return 0;
}

In function ‘int main()’:
error: request for member ‘push’ is ambiguous
error: candidates are: void EventContainer<T>::push(const T&) [with T = Event2]
error: void EventContainer<T>::push(const T&) [with T = Event1]

Почему компилятор запутался? Ведь нажимаю с конкретным типом. GCC 4.6.1 здесь.

Разрешение2: Как предположил @Matthieu M., я могу представить метод пересылки int EventStorage , но за счет одного дополнительного вызова функции:

template <typename T>
void push(const T& t)
{
    EventContainer<T>::push(t);
}

Согласно Александреску, компилятор оптимизирует этот прямой вызов до тех пор, пока параметры будут использованная литература. Теперь вопрос официально закрыт:)

6
задан Dragomir Ivanov 16 February 2012 в 11:43
поделиться