Próbuję utworzyć statycznie związaną klasę delegatów, w której funkcja elementu jest powiązana podczas kompilacji, co pomaga w optymalizacji.Odrzucenie argumentu szablonu dla wskaźnika do funkcji członka?
Mam następujący kod, który działa dokładnie tak, jak chcę go do:
#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;
}
Jednak użycie nie jest bardzo elegancki:
thr::delegate<decltype(&foo::bar), &foo::bar>
Chciałbym użyć szablonu funkcji, która dedukuje parametry szablonu i zwraca instancję delegata; coś wzdłuż linii (ten kod nie skompilować):
template<typename C, typename T, T func>
thr::delegate<T, func> bind(T func, C* obj)
{
return thr::delegate<decltype(func), func>(obj);
}
Pozwoliłoby to na bardziej elegancki składni:
auto cb = bind(&foo::bar, &f);
Czy można wywnioskować parametr non-type w szablonie funkcji?
Czy to, co staram się osiągnąć w ogóle możliwe?
Czasami można wydedukować parametr inny niż typ w szablonie funkcji, na przykład 'N' można wywnioskować w' szablonie size_t int_array_length (int (& array_ref) [N]) {return N;} '. Ale oczywiście 'N' jest częścią typu w sygnaturze funkcji, mimo że nie jest typem. –
Dodaj makro: '#define MAKE_DELEGATE (x, y) thr :: delegate (y)' Nie widzę żadnego innego sposobu na uniknięcie dwukrotnego nazwania tej funkcji. –
@Iori: Zdajesz sobie sprawę, że w twoim przykładzie 'T' będzie typem' func', więc 'decltype' nie jest konieczne :)? –