gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:11:02 28 4
gpt4 key购买 nike

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

这样做合适吗?

最佳答案

您尝试(错误地)执行的操作有语法糖分。它叫做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() inside 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)

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

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

关于C++ Functor 作为函数的输出参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51917738/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com