Estoy intentando construir una clase delegada enlazada estáticamente, donde la función miembro está ligada en tiempo de compilación, lo que ayuda a la optimización.deducción del argumento de la plantilla para el puntero a la función de miembro?
tengo el siguiente código, que funciona exactamente como yo quiero que:
#include <iostream>
namespace thr {
template<typename T, T func>
struct delegate;
template<typename R,
typename C,
typename... A,
R (C::* mem_fun)(A...)>
struct delegate<R(C::*)(A...), mem_fun>
{
delegate(C* obj_)
: _obj(obj_)
{}
R operator()(A... a)
{
return (_obj->*mem_fun)(a...);
}
private:
C* _obj;
};
} // namespace thr
struct foo
{
double bar(int i, int j)
{
return (double)i/(double)j;
}
};
int main()
{
foo f;
typedef thr::delegate<decltype(&foo::bar), &foo::bar> cb;
cb c(&f);
std::cout << c(4, 3);
return 0;
}
Sin embargo, el uso no es muy elegante:
thr::delegate<decltype(&foo::bar), &foo::bar>
me gustaría utilizar una plantilla de función que deduce los parámetros de la plantilla y devuelve una instancia de delegado; algo en la línea de (este código no compila):
template<typename C, typename T, T func>
thr::delegate<T, func> bind(T func, C* obj)
{
return thr::delegate<decltype(func), func>(obj);
}
Esto permitiría una sintaxis más elegante:
auto cb = bind(&foo::bar, &f);
¿Es posible deducir un parámetro no escriba en una plantilla de función?
¿Es lo que estoy tratando de lograr incluso posible?
A veces es posible deducir un parámetro que no sea de tipo en una plantilla de función, por ejemplo 'N' se puede deducir en' plantilla size_t int_array_length (int (& array_ref) [N]) {return N;} '. Pero, por supuesto, 'N' es parte de un tipo en la firma de la función a pesar de no ser un tipo en sí mismo. –
Agregue una macro: '#define MAKE_DELEGATE (x, y) thr :: delegate (y)' No veo otra forma de evitar nombrar la función dos veces. –
@Iori: ¿Te das cuenta de que en tu ejemplo, 'T' sería el tipo de' func' por lo que el 'decltype' no es necesario :)? –