我想用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 ;
};
这是正确的做法吗?
答案 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)