为了推断出功能对象的参数类型,我创建了一个帮助类,它允许我获得通用参数的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)。