[英]Passing a templated functor as an argument to a templated function in C++
[英]C++ Functor as an output argument of a function
我想在c ++中编写一个函数,它接受一个int类型的变量,它的作用是它将定义一个仿函数的重载operator(),并将该函数作为输出参数返回。 例如:
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表达式 ,它应该是这样的:
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
作为模板,但关键是,你可以通过传入的仿函数改变行为,所以尝试在myFunc
中硬编码operator()
并不是真的有意义,而且是不可能的。
使它更通用:
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...);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.