2014-05-13 23 views
6

ho diverse classi template Impl (con alcuni metodi astratti) che sono parzialmente attuato in file CPP così che ho bisogno di istanziare esplicitamente i miei modelli per il linker per trovarlo, in questo modo:modello istanziazione esplicita con i modelli variadic

template class Impl<T0>; 
template class Impl<T1>; 
template class Impl<T2>; 
... 
template class Impl<Tx>; 

All'aumentare del numero di tipi Tx, mi piacerebbe trovare un modo migliore di espandere manualmente questi elenchi di istanze esplicite in tutti i file necessari. Ho pensato che avrei potuto utilizzare i modelli variadic per questo, quindi ho provato la seguente:

template <template <class> class, class...> 
struct type_map; 

template <template <class> class BaseT, class... Ts> 
struct type_map<BaseT, std::tuple<Ts...>> { 
    using type = std::tuple<BaseT<Ts>...>; 
}; 

typedef std::tuple<T0, T1, T2> MyTypes; 

E nel file CPP:

template class type_map<Impl, MyTypes>; 

Tuttavia, questo non ha istanziare i modelli come ho inteso (il linker si è lamentato dei simboli mancanti).

C'è un modo per far funzionare questo approccio (cioè creare un'istanza del modello senza creare un'istanza dell'oggetto) o un approccio completamente diverso che potrebbe risolvere il mio problema in questa situazione?

+0

provi a creare dll? forse devi aggiungere la macro di esportazione al tuo tipo 'type_map' –

+1

@Angew Ho diverse classi che funzionano così, che è la ragione del mio problema. Ho cercato di formulare la mia domanda un po 'più chiara. – fschoenm

+0

@vlad_tepesch No, non uso le DLL. Questo è solo legato al problema che il compilatore non genera istanze di template che sono necessarie su altre unità di compilazione. – fschoenm

risposta

2

Non penso che sia possibile farlo con i modelli variadic, ma è possibile farlo con il preprocessore.

Vedo due opzioni. Uno potrebbe essere quello di utilizzare Boost.Preprocessor:

// Definitions: 
#define ARGUMENTS (T0)(T1)(T2)(T3)(Tx) 

#define INSTANTIATE(maUnused, maTemplate, maType) \ 
    template class maTemplate<maType>; 


// Usage: 
BOOST_PP_SEQ_FOR_EACH(INSTANTIATE, Impl, ARGUMENTS) 

BOOST_PP_SEQ_FOR_EACH(INSTANTIATE, Impl2, ARGUMENTS) 

Un'altra opzione sarebbe quella di utilizzare il X macro trucco:

x.hpp

X(T0) 
X(T1) 
X(T2) 
X(T3) 
X(Tx) 

#undef X 

using_file.cpp

#define X(maType) template class Impl<maType>; 
#include "x.hpp" 

#define X(maType) template class Impl2<maType>; 
#include "x.hpp" 
+0

Sfortunatamente, penso che non ci sia un altro approccio in questo caso. Ho ottenuto il metodo variadic template solo se le mie classi non sono astratte. Grazie comunque! – fschoenm

Problemi correlati