gpt4 book ai didi

c++ - 可以使用带有 boost 的 C++ 匿名函数吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:27 24 4
gpt4 key购买 nike

我正在尝试解决匿名函数使问题变得非常非常容易的问题,并且想知道这在 C++ 中是否可行。

我想做的是(本质上)

template<typename T>
T DoSomething(T one, function<T(T)> dosomething)
{
return one + dosomething(5);
}

void GetMyVal(...)
{
DoSomething<int>(1, /*anonymous func here*/)
}

这个例子对于我必须做的事情来说非常非常简单。在 C# 中,我会执行 p => p*5。我知道使用 C++0x 这很容易,但我不能使用它。我觉得我应该能够使用 boost::lambda 或 boost::bind 和 boost::function 与占位符的组合来完成它,但我似乎无法让它工作。这可能是不可能的,那也没关系,但如果不可能,请回答。谢谢。

编辑:好的,似乎 int 的简单情况下工作正常,那么更复杂的结构呢?那么,让我们试试

struct NumHolder
{
int x;
}

template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
NumHolder temp;
temp = 5
return one + dosomething(temp);
}

void GetMyVal(...)
{
DoSomething<int>(1, /*anonymous func here*/)
}

这里我的 C# 表达式应该是 p => p.temp * 5。这可以在 C++ 中使用 boost 来实现吗?

编辑 2:好的,现在我只是好奇 :D 我将如何在 lambda 表达式中调用函数?所以,如果我们有

int ChangeVal(int mult)
{
return mult*5;
}

struct NumHolder
{
int x;
}

template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
NumHolder temp;
temp = 5
return one + dosomething(temp);
}

void GetMyVal(...)
{
DoSomething<int>(1, /*anonymous func here*/)
}

在 C# 中,我可以调用 p => ChangeVal(p)。 C++ lambda 表达式的语法是什么?

最佳答案

正如安德斯在他的回答中指出的那样,boost::lambda 可能很有用,但在某些情况下代码会变得难以阅读。因此,这取决于您想在匿名函数中执行的操作。

对于像您在问题中提到的 p => p * 5 这样的简单情况,在我看来,使用 Lambda 或 Bind 是合理的,不过:

DoSomething(1, _1 * 5);

编辑:您的第二个示例击中了语法很快变得冗长的一个区域:成员(数据或函数)访问。因为“点”运算符不能在 C++ 中重载,所以必须使用绑定(bind)表达式从参数中获取“x”:

DoSomething(1, bind(&NumHolder::x, _1) * 5);

或者,对于 Boost.Lambda,使用重载的 ->* 运算符:

DoSomething(1, &_1->* &NumHolder::x * 5);

编辑 2:好的,最后一次 :)在你的最后一个问题中,你用 C# 编写了 p => ChangeVal(p),但是上面的代码显示了一个 ChangeVal 接受一个 int,而不是一个NumHolder,所以不清楚你的意思。

假设 ChangeVal 采用一个 int 并且您希望匿名函数执行与 ChangeVal(the_arg.x) 等效的操作,您将使用 Boost.Lambda 编写此代码:

DoSomething(1, bind(&ChangeVal, &_1->*&NumHolder::x));

或与 Boost.Bind 一起使用(也适用于 Lambda):

DoSomething(1, bind(&ChangeVal, bind(&NumHolder::x, _1));

关于c++ - 可以使用带有 boost 的 C++ 匿名函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2580123/

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