Où puis-je trouver, ou comment puis-je créer un mécanisme d'emballage de modèle de fonction élégante membre C ++ sans resporting pour stimuler?

StackOverflow https://stackoverflow.com/questions/991640

Question

Je veux être en mesure de créer des modèles à une classe sur une fonction membre sans avoir besoin de répéter les arguments de la fonction de membre - i e, les déduisez automatiquement. Je sais comment faire si je nomme la classe basée sur le nombre d'arguments de la fonction prend, mais je veux tirer cela aussi bien.

Quelque chose comme ça, bien que cela ne fonctionne pas (au moins dans MSVC 2008 sp1, qui est mon compilateur cible):

class Foo {
  void func0();
  int func2(char *, float);
};

template<typename T> class Wrapper;

// specialize for zero-argument void func
template<typename Host, void (Host::*Func)()> class Wrapper<Func> : public Base {
  ... specialization goes here ...
};

// specialize for two-argument value func
template<typename Host, typename Ret, typename Arg0, typename Arg1, Ret (Host::*Func)(Arg0, Arg1)> class Wrapper<Func> : public Base {
  ... specialization goes here ...
};

Par « Base » Je peux alors traiter ces polymorphically. En fin de compte, je veux l'utiliser pour créer une syntaxe simple wrapper pour un langage de script:

WrapClass<Bar> wrap(
  MemberFunction<&Bar::func0>("func0") +
  MemberFunction<&Bar::func2>("func2")
  );

Cependant, cela ne fonctionne pas:. La syntaxe de spécialisation est erronée, parce que vous ne pouvez pas correspondre à un pointeur de fonction à un argument typename

Était-ce utile?

La solution

Je crois que vous aurez besoin de prendre une approche traits, dont la bibliothèque la plus courante de est un stimulant de, mais si vous vouliez éviter boost, ce ne serait pas très difficile de rouler votre propre si vous limité la portée de la la mise en œuvre à pointer-membres à fonctions juste et les traits sur ceux dont vous avez besoin (conception c ++ moderne est un grand livre expliquant la théorie). Voici comment je le ferais avec les function_traits et enable_if Boost.

Vous pouvez utiliser un argument de modèle générique, enable_if pour des pointeurs de fonction, utilisez les types de fonction (ou tapez traits) pour retirer les informations dont vous avez besoin:

#include <boost/function_types/function_arity.hpp>
#include <boost/function_types/is_member_pointer.hpp>

template<typename T, class Enable = void> class Wrapper;

/* other specializations... */

// For member functions:
template <class T>
class Wrapper<T, typename enable_if<is_member_pointer<T> >::type>
{ /* function_arity<T>::value has the number of arguments */ };

Voir cette cette

Autres conseils

La bibliothèque standard C ++ fournit mem_fun_ref quel type d'œuvres comment vous voulez, mais il ne fonctionne que pour les fonctions arité et unaires. Bien sûr, vous pouvez utiliser une struct avec tous les paramètres que votre seul argument.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top