C++ 是否可以将lambda表达式放入C++;?

C++ 是否可以将lambda表达式放入C++;?,c++,C++,@DanielLangr@luxun@cdhowie很抱歉XY问题。我不确定我能解释清楚,但我尽力了。情况几乎是这样的:有一个基本对象“Worker”和一些子对象。厨师、裁缝。。。孩子们有着和走路、跑步、睡觉一样的动作……但是不同的技能,厨师可以做食物,裁缝可以做衣服。调用程序调用Worker dothings,但并不确切知道它们的专业。因此,我在Worker基本对象上添加了一个接口dothings(Thing)。事物是一个枚举,价值是制造食物,制造衣服 Worker *w = new Chef

@DanielLangr@luxun@cdhowie很抱歉XY问题。我不确定我能解释清楚,但我尽力了。情况几乎是这样的:有一个基本对象“Worker”和一些子对象。厨师、裁缝。。。孩子们有着和走路、跑步、睡觉一样的动作……但是不同的技能,厨师可以做食物,裁缝可以做衣服。调用程序调用Worker dothings,但并不确切知道它们的专业。因此,我在Worker基本对象上添加了一个接口dothings(Thing)。事物是一个枚举,价值是制造食物,制造衣服

Worker *w = new Chef();
w->dothings(MakeFood);//
w->dothings(MakeClothes);//throw exception "w do not have skill"
因此,我认为meybe在儿童中使用一个容器来描述它可以做什么以及如何做

希望我解释清楚。有更好的解决办法吗

我想将不同的lambda表达式放入列表或Qmap中,如下所示

Qmap<String, lambda> map;
map.insert("first",[](int i) -> int {return i;});
map.insert("second",[](string s) -> string {return s;});
Qmap;
insert(“first”,[](int i)->int{return i;});
insert(“第二个”,[](字符串s)->字符串{returns;});
< C++中有可能吗?lambda的类型是什么?

可以,但要使用

比如说,

std::map<std::string, std::function<void(std::string)>> my_map;
my_map.emplace("first", [](std::string i) { std::cout << i << std::endl; });
产出:

In any
100
1000

使用
any
,解决方案可能如下所示:

auto lambda1 = [](int i) { return i; };
auto lambda2 = [](std::string s) { return s; };

std::map<std::string, std::any> map;
map["first"] = lambda1;
map["second"] = lambda2;

std::cout << std::any_cast<decltype(lambda1)>(map["first"])(-1) << std::endl;
std::cout << std::any_cast<decltype(lambda2)>(map["second"])("hello") << std::endl;
现场演示:



然而,正如other所指出的,这似乎确实是一个XY问题。

我认为上面的示例不起作用,因为上面的lambda将有不同的类型:一个返回字符串,另一个返回int。什么是
Qmap
?很可能不可能,但您应该能够在
std::function
的帮助下将lambda存储到容器中。请注意,所有这些函数都必须有兼容的签名。退一步,忘掉lambda、函数和映射——你想在这里完成什么?根据最近的编辑,我认为我们正在取得进展:)实现你所尝试的一种方法是取消lambda的映射,并在基类上为所有类型的任务(制作食物、制作衣服等)提供虚拟函数。基类实现可能引发异常,然后由子类定义应该重写哪些函数。根据您更广泛的上下文,可能有更好的方法,因此您可能希望对此进行详细说明,但可以满足当前的要求。我的问题是,我放入map中的lambda可能具有不同的返回类型。因此,我认为std::function没有帮助。如果我使用boost::any,我应该在boost::any_cast中使用哪种类型?@miniboxHaHa你想用它实现什么?对于不同的返回类型,你可以返回boost::any。@abhiorra我认为你是对的。我会在我的代码中尝试。谢谢使用
any
有点毫无意义,因为之后没有好的方法与值交互,因为你需要知道你感兴趣的所有候选类型。我认为你是对的。我会在我的代码上尝试。谢谢!使用
any
有点毫无意义,因为没有很好的方法在之后与值交互,因为您需要知道您感兴趣的所有候选类型。
auto lambda1 = [](int i) { return i; };
auto lambda2 = [](std::string s) { return s; };

std::map<std::string, std::any> map;
map["first"] = lambda1;
map["second"] = lambda2;

std::cout << std::any_cast<decltype(lambda1)>(map["first"])(-1) << std::endl;
std::cout << std::any_cast<decltype(lambda2)>(map["second"])("hello") << std::endl;
std::map<std::string, std::any> map;
map["first"] = std::function<int(int)>( [](int i) { return i; } );
map["second"] = std::function<std::string(std::string)>( [](std::string s) { return s; } );

std::cout << std::any_cast<std::function<int(int)>>(map["first"])(-1) << std::endl;
std::cout << std::any_cast<std::function<std::string(std::string)>>(map["second"])("hello") << std::endl