¿Dónde puedo encontrar, o cómo puedo crear un elegante plantilla de función mecanismo de envoltura miembro de C ++ sin resporting para impulsar?

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

Pregunta

Quiero ser capaz de crear plantillas de una clase en una función miembro sin necesidad de repetir los argumentos de la función miembro - i e, ellos derivan automáticamente. Yo sé cómo hacer esto si nombro a la clase basado en el número de argumentos de la función toma, pero quiero que derivar también.

Algo como esto, aunque esto no funciona (al menos en MSVC 2008 SP1, que es mi objetivo compilador):

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

A través de "Base" Puedo entonces tratar estos polimórfica. Al final, quiero usar esto para crear una sintaxis simple envoltorio para un lenguaje de script:

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

Sin embargo, eso no funciona:. La sintaxis especialización es incorrecto, porque no se puede coincidir con un puntero de función a un argumento de nombre de tipo

¿Fue útil?

Solución

Creo que tendrá que adoptar un enfoque rasgos, la biblioteca más común de las cuales es de impulso, pero si quería evitar impulso, no sería muy difícil de rodar su propia si limitan el alcance de la aplicación a solo puntero a miembros de la funciones y los rasgos en los que necesita (diseño moderna c ++ es un gran libro explicar la teoría). Así es como lo haría con function_traits y enable_if de impulso.

Se puede usar un argumento de plantilla genérica, enable_if para los punteros de función, a continuación, utilizar los tipos de función (o rasgos de tipo) para extraer la información que necesita:

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

este este

Otros consejos

La biblioteca C ++ estándar proporciona mem_fun_ref qué tipo de obras como quieres, aunque sólo funciona para nularia y funciones unarios. Por supuesto, se puede utilizar una estructura con todos los parámetros como su único argumento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top