decltype可以用于获取参数的类型吗?

时间:2014-02-16 18:24:23

标签: c++ templates decltype

我试图通过使用类型推导来构建一种(更好的)方法来从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'的模板参数无效,是预期的编译时常量表达式。

有什么想法吗?

1 个答案:

答案 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);
}