2010-07-02 3 views
1

Je crois que je l'avais vu macro coup de pouce qui récupère les paramètres du modèle de modèle, par exemple:paramètre de modèle C++ boost traits

template<class> 
struct parameters; 

#define parameters(T) template<class A> \ 
      struct parameters<T<A> > { typedef A type1; }; 

est là un comme ça, ou je me trompe?

Merci

+0

Qu'est-ce que 'T'? _____ – kennytm

+0

@Ken désolé, je clarifie peu bit – Anycorn

+1

Pour la technique générale C++ pour faire cela, il ya une question ici: http://stackoverflow.com/questions/301203/extract-c-template-parameters. Je sais que ce n'est pas une dupe car cela demande une émulation de boost, mais pour toute personne intéressée ... –

Répondre

1

delctype support dans C++ 0x rend ce assez trivial à mettre en œuvre:

template<template <typename> class Parent, typename Param1> 
Param1 get_type(Parent<Param1> const &input) { return Param1(); } 

SomeTpl<int> some_obj; 
delctype(get_type(some_obj)) x; 

(Même si vous avez besoin d'une définition de get_type séparée pour les modèles avec 2, 3, 4, paramètres, etc. Malheureusement, je ne pense pas qu'il existe un moyen de le faire sans decltype, car pour cela, il faut automatique la déduction de type fournie par les modèles de fonction (qui n'est pas disponible pour les modèles de classe) et donc il n'y a pas le moyen de faire un typedef de cette façon. Je ne sais pas si Boost a quelque chose comme ça déjà, mais si elles le font, il faudra toujours votre compilateur pour soutenir decltype, mais depuis decltype est si nouveau, il n'y a pas beaucoup de choses dans boost que l'utilise encore (bien qu'il y en ait).

0

J'ai appris à faire confiance aux déclarations de Johannes, donc je suis un peu confus, puisque cela semble compiler Ok pour moi avec VC10 et imprime les attendus int:

#include <iostream> 
#include <typeinfo> 

template< class T > 
class steal_it; 

template< typename U, template<typename> class C > 
struct steal_it< C<U> > { 
    typedef U result_t; 
}; 

template< typename T > 
class foo {}; 

template< typename T > 
void test_it(T) 
{ 
    typename steal_it<T>::result_t bar = 42; 
    std::cout << typeid(bar).name() << '\n'; 
} 

int main(){ 

    test_it(foo<int>()); 

    return 0; 
} 

Bien sûr, puisque je n ne vérifie pas avec d'autres compilateurs, cela pourrait juste être VC me tromper à nouveau ...

+0

Merci pour votre confiance :) Thouh je me demande ce qui vous fait penser que je dirais que cela ne fonctionnerait pas. C'est aussi un cas particulier, car vous devez supposer que le modèle a un paramètre de type. Dans ce cas, vous pouvez utiliser directement le paramètre function pour la déduction 'template classe C, nom de type U> void test_it (C ) {U bar = 42;/* ... * /} '. Dans mon autre réponse, je me référais à des listes de paramètres de templates entièrement arbitraires, pour lesquelles ce n'est plus possible :) Vous pouvez même résoudre ceci sans évaluer l'expression 'foo ()' en utilisant l'astuce de l'opérateur conditionnel. –

+0

@Johannes: Mais qu'est-ce qui vous empêche de spécialiser 'steal_it' pour les paramètres de template 1-50 et obtenir ainsi une solution générique pour tous les moyens pratiques? – sbi

+0

@sbi cela ne peut pas fonctionner car vous avez besoin que tous les paramètres soient des types. Vous ne pouvez pas passer 'boost :: array' à un tel modèle, par exemple. –

Questions connexes