我试图使用function_traits类来推断lambda的operator()成员函数指针,使用公知的语法(Class :: * pointer)(Args列表)。 但问题出在typedefs / using专业化中。看起来编译器没有使用我的特性'类模板专业化。并且坚持一般情况 编译说
没有名为' result_type'在' function_traits'
没有名为' FunctionsType'的类型在' function_traits'
#include <functional>
#include <iostream>
using namespace std;
template <typename T>
struct function_traits {};
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) >
// we specialize for pointers to member function
{
using result_type = ReturnType;
using FunctionsType = ReturnType(ClassType::*)(Args...);
using arg_tuple = std::tuple<Args...>;
static constexpr auto arity = sizeof...(Args);
};
template <typename F>
struct lambda_expression_my
{
typedef function_traits<decltype(&F::operator())> traits;
typedef typename traits::result_type RT;
typedef typename traits::FunctionsType FunctionType;
F _object;
FunctionType _function;
lambda_expression_my(const F & object) :
_object(object),
_function(&F::operator()) {}
template <typename ... Args>
RT operator() (Args ... args) const {
return (_object.*_function)(args...);
}
};