2011-09-15 6 views
3

je le suivant modèle « main »:« Application partielle » pour les paramètres du modèle

template < 
     template <typename> class S 
    > struct TT { /*...*/ }; 

et le modèle que je veux utiliser avec TT:

template <int N, typename T> struct S1 {}; 

Je veux, en particulier, d'utiliser quelque chose comme

TT< S1<5> > t2; // "Invalid template arguments" here 

C'est une sorte d'application partielle pour les modèles. Je sais que Boost.MPL implique ce genre de choses. Le problème est que j'ai déjà du code en utilisant TT et des modèles comme

template <typename T> struct S2 {}; // S3, S4… 

qui sont alimentés à TT.

Donc la question est: comment puis-je utiliser S1 avec TT avec les plus petites modifications au code existant. S'il est obligatoire d'utiliser Boost.MPL, veuillez me montrer la solution la plus appropriée.

+1

est 'modèle struct TT {/*...*/};' pas une option? –

+0

'TT < S1<5>> t2;' il vous manque le second argument de S1. Maître de l'évidente et à l'extérieur. – AJG85

+0

@Mooing Merci, j'ai déjà considéré cette option, mais TT a vraiment typedef interne (disons P) qui est vraiment un "détail d'implémentation" et TT spécifie S avec P. À ce stade, je ne vois pas comment puis-je faire TT accepte le type au lieu du modèle avec au moins un paramètre de type. –

Répondre

7

Définir un modèle de classe provenant de S1 comme:

template <typename T> 
struct S11 : S1<5,T> 
{ 
}; 

Et puis utilisez S11, au lieu de S1 comme:

TT< S11> t2; //it is as if TT< S1<5> > t2 

Code de travail: http://ideone.com/y2s7n


La lecture de votre commenter, il semble que vous avez besoin ceci:

template<int N> 
struct Magic 
{ 
    template <typename T> 
    struct S11 : S1<N,T> 
    { 
    }; 
}; 

//Usage 
TT<Magic<5>::S11> t2; 

magique Demo: http://ideone.com/4yxvK

+1

C'est vraiment génial, merci. –

+0

Impossible de donner un autre +1 – AJG85

2

vous pouvez également écrire une installation d'application partielle générique:

template <template <typename ...> class TT, typename... Args> 
struct Apply 
{ 
    template <typename... Rest> 
    struct T : TT < Args..., Rest... > 
    { 
    }; 
}; 

ou comme si vous voulez être l'original le temps de résultat de l'application les spécialisations du modèle au lieu d'une classe dérivée (d'une classe dérivée, etc.):

template <template <typename ...> class TT, typename... Args> 
struct Apply 
{ 
    template <typename... Rest> 
    struct _T 
    { 
     typedef TT < Args..., Rest... > type; 
    }; 

    template <typename... Rest> 
    using T = typename _T <Rest...>::type ; 
}; 
Questions connexes