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

How to call a Functor template class with template function

本文关键字:函数调用 何使用      更新时间:2023-10-16

考虑下面简化的一元函子的代码

#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 中编译不行

看起来像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);

(为了完整起见,常量/非常量/右值引用/指针的重载identity