4 votes

Utiliser une expression non constante en tant que paramètre de modèle

Ceci est un suivi sur Comment puis-je obtenir les types d'arguments d'un pointeur de fonction dans une classe de modèle variadique?

J'ai cette structure pour accéder aux arguments d'un modèle variadique :

template 
struct function_traits;  

template 
struct function_traits>
{
    static const size_t nargs = sizeof...(Args);

    typedef R result_type;

    template 
    struct arg
    {
        typedef typename std::tuple_element>::type type;
    };
};

Et j'accède au type d'un argument de Args avec

typedef function fun;
std::cout << std::is_same::template arg<0>::type>::value << std::endl;

Cependant, je voudrais itérer à travers les arguments pour pouvoir gérer un nombre arbitraire d'arguments. Ce qui suit ne fonctionne pas, mais pour illustrer ce que je veux :

for (int i = 0; i < typename function_traits::nargs ; i++){ 
    std::cout << std::is_same::template arg::type>::value << std::endl;
}

6voto

Mike Seymour Points 130519

Il vous faudrait faire une itération à temps de compilation sur le modèle de

template <typename fun, std::size_t i> struct print_helper {
    static void print() {
        print_helper<fun, i-1>::print();
        std::cout << std::is_same<int, typename function_traits<fun>::template arg<i-1>::type>::value << std::endl;
    }
};

template <typename fun> struct print_helper<fun,0> {
    static void print() {}
};

template <typename fun> void print() {
    print_helper<fun, function_traits<fun>::nargs>::print();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X