Comment puis-je obtenir les types d'argument un pointeur de fonction dans un variadic template de classe?
C'est un suivi de ce problème: Générique foncteur pour les fonctions avec toute la liste d'arguments
J'ai ce foncteur classe (code complet voir le lien ci-dessus):
template<typename... ARGS>
class Foo
{
std::function<void(ARGS...)> m_f;
public:
Foo( std::function<void(ARGS...)> f ) : m_f(f) {}
void operator()(ARGS... args) const { m_f(args...); }
};
Dans l'opérateur() je peux accéder à la args... facilement avec un récursif "peeling" de la fonction, comme décrit ici http://www2.research.att.com/~bs/C++0xFAQ.html#variadic-modèles
Mon problème est: je veux accéder aux types des arguments de f, c'est à dire ARGS..., dans le constructeur. Évidemment, je ne peux pas accéder à des valeurs, car il n'y a pas loin, mais l'argument de type liste est en quelque sorte enterré dans f, n'est-ce pas?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez écrire
function_traits
classe comme indiqué ci-dessous, pour découvrir les types d'argument, de type de retour, et le nombre d'arguments:Code de Test:
Démo : http://ideone.com/YeN29
std::function
?ARG...
, vous devez utilisertypename
ettemplate
des mots clés pour lever l'ambiguïté de la situation. Ainsi, au lieu defunction_traits<fun_vararg>::arg<0>::type
, vous devez écriretypename function_traits<fun_vararg>::template arg<0>::type
. Voir que ça marche : ideone.com/bysFS