Я пытаюсь создать статически связанный класс делегата, в котором функция-член связана во время компиляции, тем самым способствуя оптимизации.
У меня есть следующий код, который работает именно так, как я хочу:
#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;
}
Однако использование не очень элегантно:
thr::delegate<decltype(&foo::bar), &foo::bar>
Я хотел бы использовать шаблон функции, который выводит параметры шаблона и возвращает экземпляр делегата; что-то вроде (этот код не компилируется):
template<typename C, typename T, T func>
thr::delegate<T, func> bind(T func, C* obj)
{
return thr::delegate<decltype(func), func>(obj);
}
Это позволит использовать более элегантный синтаксис:
auto cb = bind(&foo::bar, &f);
Можно ли вывести не типовой параметр в шаблоне функции?
Возможно ли то, что я пытаюсь достичь, возможно?