Dove posso trovare, o come posso creare un elegante involucro meccanismo di template di funzione C ++ membro senza resporting per aumentare?

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

Domanda

Voglio essere in grado di templatize una classe su una funzione membro senza dover ripetere gli argomenti della funzione membro - I IT, li traggo automaticamente. So come fare questo se nomino la classe in base a quanti argomenti la funzione prende, ma voglio ricavare che pure.

Qualcosa di simile, anche se questo non funziona (almeno in MSVC 2008 SP1, che è il mio compilatore target):

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 ...
};

Con "Base" Posso poi trattare questi polimorfico. Alla fine, voglio usare questo per creare una sintassi semplice wrapper per un linguaggio di scripting:

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

Tuttavia, ciò non funziona:. La sintassi di specializzazione è sbagliato, perché non si può abbinare un puntatore a funzione di un argomento typename

È stato utile?

Soluzione

Credo che sarà necessario adottare un approccio tratti, la biblioteca più comune dei quali è spinta di, ma se si voleva evitare di spinta, non sarebbe estremamente difficile per rotolare il proprio se si limitato la portata del implementazione di puntatore-a-membri funzioni solo e tratti su quelle desiderate ( moderna C ++ di progettazione è un grande libro spiegando la teoria). Ecco come lo farei con function_traits e enable_if di boost.

Si potrebbe usare un argomento di modello generico, enable_if per puntatori a funzione, quindi utilizzare tipi di funzione (o digitare tratti) per estrarre le informazioni necessarie:

#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 */ };

questo e questo

Altri suggerimenti

La libreria C ++ standard fornisce mem_fun_ref quale tipo di opere come si desidera, anche se funziona solo per nullaria e funzioni unari. Naturalmente, è possibile utilizzare una struttura con tutti i parametri come il vostro un argomento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top