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...);
}
我想用 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...);
}