Сохраняем старый вопрос. См. Разрешение ниже. Это наверное что-то простое, но все же. У меня есть следующий фрагмент кода 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);
}
Согласно Александреску, компилятор оптимизирует этот прямой вызов до тех пор, пока параметры будут использованная литература. Теперь вопрос официально закрыт:)