Rispondere alla vecchia domanda. Vedi sotto per la risoluzione. Probabilmente è qualcosa di semplice, ma ancora. Ho il seguente C++ 11 frammento di codice:C++ 11 parametri modello template variad.
#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;
}
Come posso fare EventStorage
ereditare EventContainer
templeted con ciascuno dei tipi nella typelist
. Potrei farlo con Loki :: library, ma voglio usare C++ 11 con modelli variadic. Grazie.
Risoluzione1: problema di modello di modello di riparazione EventStorage
. Questo renderà EventStorage
, multiple erediterà tutte le EventContainer
con ciascun tipo di Ts
.
template <typename...>
class EventStorage
{
};
template <typename... Ts>
class EventStorage < typelist<Ts...> >:
public EventContainer<Ts>...
{
};
Ora ho compilazione errore di tempo, sul seguente 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]
Perché il compilatore è confuso? Dopotutto spingo con tipo specifico. GCC 4.6.1 qui.
risoluzione2: Come @Matthieu M. suggerito posso presentare un metodo di inoltro int EventStorage
, ma al costo di una chiamata functin in più:
template <typename T>
void push(const T& t)
{
EventContainer<T>::push(t);
}
Secondo Alexandrescu, il compilatore di ottimizzare questa chiamata in avanti finché i parametri sono riferimenti. Ora la domanda è ufficialmente chiusa :)
Vorrei poter granulare diversi tipi di permutazioni di eventi. Per esempio. 'typedef typelist pumpEvents;' 'typedef typelist displayEvents;' Ma come lo metti in questo modo, vorrei combinare i due 'typelists', se lo storage necessita per memorizzarli entrambi. –
Ho modificato la mia risposta per includere un adattatore 'typelist' e un combinatore di archiviazione. –
Grazie mille. Ci proverò, dopo aver risolto questo problema di ambiguità dai miei altri commenti di risposta. E 'molto strano. 'Push()' gots è sovraccarico? –