如何使用模板函数调用Functor模板类

时间:2014-11-23 08:39:25

标签: c++ templates

考虑一下简化的一元仿函数的代码

#include <type_traits>

template <class FuncT, class FuncArgT>
class UnaryFunctor
{
    FuncT func;

public:
    UnaryFunctor(FuncT const& func) : func(func) {}

    template <class ArgsT> struct result {};

    template <class F, class ArgT>
    struct result < F(ArgT) >
    {
        typedef typename std::result_of<FuncT(ArgT)>::type type;
    };

    template <class ArgT>
    typename result<UnaryFunctor(ArgT)>::type
        inline operator()(ArgT const& arg) const
    {
        return func(arg);
    }
};

template <class FuncT, class ArgT>
struct Result
{
    typedef typename std::result_of<UnaryFunctor<FuncT, ArgT>(ArgT)>::type type;
};

template <class FuncT, class ArgT>
typename Result<FuncT, ArgT>::type
inline unary_apply(FuncT const& func, ArgT const& arg)
{
    return UnaryFunctor<FuncT, ArgT>(func)(arg);
}

所以基本上目的是调用一个带有传递值的函数。 让我们说下面我们有两个简单的函数。

template <class T> T addValueTemplate(T const& val) { return val + 3; }
unsigned int addValue2(unsigned int const& val) { return val + 3; }

调用此功能

unsigned int i = 1, j;
j = unary_apply(&addValue2, i);

但是我无法解决如何对模板类addValueTemplate做同样的事情。例如,这不会编译

j = unary_apply(&addValueTemplate<unsigned int>, i);

有办法吗? 顺便说一句,这在GCC中很好地编译,但在msvc

中没有

1 个答案:

答案 0 :(得分:1)

看起来像是MSVC中的一个错误。它认为&addValueTemplate<unsigned int>是一个函数,而不是一个函数指针。使用中间函数指针变量:

unsigned int (*av)(unsigned int const&) = &addValueTemplate;
j = unary_apply(av, i);

或者用它来欺骗MSVC:

template <typename T>
T* identity(T* x) { return x; }

j = unary_apply(identity(&addValueTemplate<unsigned int>),i);

(为完整性,对const /非const / rvalue引用/指针重载identity