gpt4 book ai didi

C++一般如何将成员函数转换为独立函数(用作函数参数)?

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

对于模板函数的函数参数,我发现自己经常将成员函数包装在 lambda 中以创建相同的独立函数,第一个参数是对象。

一个(虚拟)示例:

class A
{
public:
double f1() const;
double f2(int i) const;

// some data
};

template <typename Func>
double calculateSum(std::vector<A> as, Func f)
{
double result = 0.0;
for (auto a : as)
result += f(a);
return result;
}

int main()
{
std::vector<A> as;
int i = 0;
auto sum1 = calculateSum(as, [](const A& a) { return a.f1(); });
auto sum2 = calculateSum(as, [&i](const A& a) { return a.f2(i); });
return 0;
}

有没有办法更通用地定义这样的 lambda?或者有没有办法直接引用成员函数而不是使用 lambdas?

最佳答案

您可以使用 C++14 通用 lambda 来帮助解决这个问题。像这样定义您的通用 lambda:

auto bindMem = [](auto f, auto& ... memArgs) { return [f, &memArgs...](auto& a) { return (a.*f)(memArgs...); }; };

摘要:这创建了一个通用的 lambda,调用它会产生另一个 lambda。第一个 lambda 获取您要调用的成员函数,以及任何绑定(bind)参数(this 对象除外)。它产生第二个 lambda,然后它需要对象本身,并使用先前绑定(bind)的参数将成员函数调用应用于它。

因此对于您的用例,您拥有整洁的外观:

auto sum1 = calculateSum(as, bindMem(&A::f1));
auto sum2 = calculateSum(as, bindMem(&A::f2,i));

关于此的伟大之处在于完全相同的 bindMem lambda 将适用于任何类和任何成员函数,具有任意参数列表。因此,就您的意思而言,它确实是通用的。

关于C++一般如何将成员函数转换为独立函数(用作函数参数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40635168/

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