¿Cómo puedo hacer que el nombre del método (aquí some_method
) sea un parámetro de plantilla?Nombre del método C++ como parámetro de plantilla
template<typename T>
void sv_set_helper(T& d, bpn::array const& v) {
to_sv(v, d.some_method());
}
¿Cómo puedo hacer que el nombre del método (aquí some_method
) sea un parámetro de plantilla?Nombre del método C++ como parámetro de plantilla
template<typename T>
void sv_set_helper(T& d, bpn::array const& v) {
to_sv(v, d.some_method());
}
No existe un 'parámetro identificador de plantilla', por lo que no puede pasar nombres como parámetros. sin embargo, puede tener un puntero a función miembro como argumento:
template<typename T, void (T::*SomeMethod)()>
void sv_set_helper(T& d, bpn::array const& v) {
to_sv(v, (d.*SomeMethod)());
}
que está asumiendo la función tiene un tipo de retorno void
. Y se le llama así:
sv_set_helper< SomeT, &SomeT::some_method >(someT, v);
Aquí está un ejemplo sencillo ...
#include <iostream>
template<typename T, typename FType>
void bar(T& d, FType f) {
(d.*f)(); // call member function
}
struct foible
{
void say()
{
std::cout << "foible::say" << std::endl;
}
};
int main(void)
{
foible f;
bar(f, &foible::say); // types will be deduced automagically...
}
+1 Gracias, tenías la parte '. * F' justo antes de K-ballo, pero su respuesta fue primero. –
Gracias! Al poner T :: * SomeMethod entre paréntesis, esta solución funciona. –