C++ Functor 作为函数的输出参数

C++ Functor as an output argument of a function

我想用 c++ 编写一个函数,它接受一个 int 类型的变量,它的作用是定义一个仿函数的重载运算符 () 并将 return 该仿函数作为输出参数。例如:

template<class Functor>
Functor myFunc(double n)
{
   Functor f; 
   double Functor::operator() (double q) 
   { return n*q;} 
   return Functor; 
} 
class myClass 
{ 
  double operator() ( double q ) const ;
};

这样做合适吗?

你试图(错误地)做的事情有一个语法糖。它叫做 lambda expressions,它应该是这样的:

auto myFunc(double n)
{
    return [n](double q) { return n * q; }
}

如果 C++11 不可用,您可以像这样模拟它(这修复了您上面的错误):

class Functor
{
    double m_n;

public:
    Functor(double n) : m_n(n) {}

    double operator()(double q) const { return m_n * q; }
};

Functor myFunc(double n)
{
    return Functor(n);
}

如果您愿意,可以将 myFunc 保留为模板,但要点是,您可以通过传入的函子更改行为,因此尝试在 [=] 中硬编码 operator() 15=] 没有意义,也不可能。


使其更通用:

template <typename T>
class Functor
{
    T m_n;

public:
    Functor(T n) : m_n(n) {}

    T operator()(T q) const { return m_n * q; }
};

template <template <typename> class Functor, typename T>
auto myFunc(T n)
{
    // we can use perfect forwarding here, but it's far beyond the original question
    return Functor<T>(n);
}

用法:

myFunc<Functor>(2)(3)

更通用,对于仿函数(可变参数模板)捕获的可变数量的参数:

template <template <typename ...> class Functor, typename ... Ts>
auto myFunc(Ts ... ns)
{
    return Functor<Ts...>(ns...);
}