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

时间:2018-08-19 12:38:41

标签: c++ functor

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

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 ;
};

这是正确的做法吗?

1 个答案:

答案 0 :(得分:3)

您尝试(错误地)执行的操作有一个语法糖。它叫做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保留为模板,但要注意的是,您可以根据传入的函子来更改行为,因此尝试在{{1}内对operator()进行硬编码。 }毫无意义,也是不可能的。


使其更通用:

myFunc

用法:

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)
相关问题