我试图通过使用类型推导来构建一种(更好的)方法来从Impossibly Fast Delegate创建委托。但是,我遇到了一些问题。
这是我正在努力简化的功能:
template<typename T, void(T::*TMethod)(E)>
static Delegate<E> create(T * object) { /* ... */ }
当您调用此函数时,它看起来像这样:
auto del = Delegate<int>::create<A, &A::foo>(&a);
我最终想要的是:
auto del = create_delegate(&a, &A::foo);
我认为decltype可以做到这一点,但不知何故它不起作用(使用VS2012):
template<typename E, typename T>
Delegate<E> create_delegate(T * obj, void (T::*method)(E))
{
return Delegate<E>::create<T, decltype(method)>(obj);
}
我收到错误C2975:'Delegate :: create':'TMethod'的模板参数无效,是预期的编译时常量表达式。
有什么想法吗?
答案 0 :(得分:0)
为什么不使用std :: function?
#include <functional>
#include <iostream>
struct X {
void fn(int) {
std::cout << "Hello\n";
}
};
template<typename T, typename R, typename A>
std::function<R(A)> create_delegate(T& obj, R (T::*method)(A))
{
return std::bind(method, &obj, std::placeholders::_1);
}
int main() {
X x;
auto delegate = create_delegate(x, &X::fn);
delegate(1);
}