从bind-expression中推导出参数类型

时间:2015-03-25 15:09:01

标签: c++ templates c++11 lambda

为了推断出功能对象的参数类型,我创建了一个帮助类,它允许我获得通用参数的std::function<...>。辅助类现在看起来像这样:

template<typename T>
class functional_traits : public functional_traits<decltype(&T::operator())> {

};

template<typename Ret, typename ClassType, typename... Args>
class functional_traits < Ret(ClassType::*)(Args...) const > {
public:
    typedef std::function<Ret(Args...)> FunctionType;
};

与最后一个版本相同的版本也存在非const特化。您可以这样使用:

template<typename T>
void foo(const T& value) {
    auto function = (typename functional_traits<T>::FunctionType)(value);
}

foo([](int a) { return a * 2.3f; });

您将拥有std::function<float (int)>的功能。这很好,因为根据标准,lambda需要最终作为C ++非联合类对象,其成员operator()是const或非const(当lambda是可变的时)

对于正在发挥作用的事情非常重要;)

现在的问题是我使用foo(std::bind(someMethod, std::placeholders::_1))时。 std :: bind的返回类型不是由标准指定的,它甚至不是强制性的,它的特征是operator ()。在Visual Studio和gcc中有这样一个运算符,但它有4个重载(一个是volatile,一个是volatile,一个是const,另一个是没有修饰符)。当然,decltype(&T::operator())失败了,因为它不知道我想要的重载。

我尝试使用typedes将T转换为always const volatile类型,然后希望&T_cv::operator()始终选择运算符的const volatile版本,但事实并非如此。

所以我的问题或问题是:有没有办法从std::bind获得部分特化的结果参数?我假设存在一个operator (),因为我只对Visual Studio感兴趣(可能后来很多gcc)。

0 个答案:

没有答案