在模板特化中减少依赖类型

时间:2017-06-03 09:34:02

标签: c++ c++11 templates lambda type-deduction

我试图使用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...);
    }
};

0 个答案:

没有答案