Guardando la vieja pregunta. Vea a continuación para la resolución. Probablemente sea algo simple, pero aún así. Tengo el siguiente C++ 11 fragmento de código:C++ 11 parámetros de plantilla de plantilla variadic
#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;
}
¿Cómo puedo hacer EventStorage
hereda EventContainer
templeted con cada uno de los tipos en el typelist
. Podría hacerlo con Loki :: library, pero quiero usar C++ 11 con plantillas variadas. Gracias.
Resolución 1: problema de plantilla de plantilla de fijación EventStorage
. Esto hará que EventStorage
herede múltiples EventContainer
plantilla con cada tipo de Ts
.
template <typename...>
class EventStorage
{
};
template <typename... Ts>
class EventStorage < typelist<Ts...> >:
public EventContainer<Ts>...
{
};
Ahora tengo error de compilación tiempo, en el siguiente 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]
Por qué se confunde el compilador? Después de todo, presiono con un tipo específico. GCC 4.6.1 aquí.
resolución2: Como @Matthieu M. sugirió que puedo presentar un método de reenvío int EventStorage
, pero a un costo de una llamada adicional functin:
template <typename T>
void push(const T& t)
{
EventContainer<T>::push(t);
}
Según Alexandrescu, el compilador optimizar este desvío de llamadas siempre que los parámetros sean referencias. Ahora la pregunta se cerró oficialmente :)
Ojalá pudiera granular diferentes tipos de permutaciones 'Event'. P.ej. 'typedef typelist pumpEvents;' 'typedef typelist displayEvents;' Pero como usted lo dice, me gustaría combinar las dos 'typelists', si el almacenamiento lo necesita para almacenarlos a ambos. –
Edité mi respuesta para incluir un adaptador 'typelist' y un combinador de almacenamiento. –
Muchas gracias. Voy a intentar eso, después de resolver este problema de ambigüedad de los demás, responder el comentario. Es muy extraño. ¿No está sobrecargado 'push()' gots? –