C++怎么构建 key 是 string, value 是函数的 map

2018-02-20 16:17:29 +08:00
 fyyz

C++怎么构建 key 是 string,value 是函数的 map

网上查了下,用 std::function 可以表示一个函数对象,目前我写出来的类型是这样的:

std::map<
    std::string, 
    std::function<
        std::string(param_1&, param_1&)
    >
>
handle_map;

这样写对吗?

还有,这种 map 应该怎么 insert 数据进去啊,insert 的时候 std::function 对象是要用 std::bind 构造出来丢进去吗?

5135 次点击
所在节点    C
47 条回复
iceheart
2018-02-20 16:33:12 +08:00
param_1 和 param_2 换成参数类型
handle_map["hello"] = [] (class1 &x, class2 &y) {return "world";}
snnn
2018-02-20 16:35:03 +08:00
你会用函数指针吗?如果简单的东西就能搞定,就别太复杂
monnand
2018-02-20 16:53:11 +08:00
@iceheart 说得对。

千万别按 @snnn 说的用函数指针。现在已经 2018 年了
laike9m
2018-02-20 18:45:42 +08:00
@snnn 没看出 std::function 哪里复杂
fyyz
2018-02-20 18:53:00 +08:00
@iceheart 我要回调的函数挺大的,如果全写成 lambad 会很乱,用 bind 可以吗
geelaw
2018-02-20 18:57:25 +08:00
@fyyz 你送进去的只要是能接受 param_1 &, param_2 & 形参,返回值能隐式转换为 std::string 的仿函数即可。
helloworld000
2018-02-20 19:40:21 +08:00
snnn
2018-02-20 20:13:42 +08:00
我汗。。。
你们都是群天才
bramblex
2018-02-20 20:26:57 +08:00
@snnn

std::function 怎么也比函数指针简单吧,怎么就天才了?

以及,好久不见呀 /w|
q397064399
2018-02-20 20:35:26 +08:00
C++有这么复杂吗?
你把 key 弄成 string value 弄成 type + param1 + param2 组成的结构体 根据 type 调用不同的函数不就好了吗?
inkedawn
2018-02-20 20:45:16 +08:00
> std::function 的实例能存储、复制及调用任何可调用 (Callable) 目标——函数、lambda 表达式、bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。
http://zh.cppreference.com/w/cpp/utility/functional/function
inkedawn
2018-02-20 20:54:22 +08:00
std::bind 是用来封装绑定参数的,如果不需要对函数包装的话直接 insert 就可以了,通过 std::function 的构造函数可以直接隐式转换。

std::string f(param_1&, param_1&);
handle_map["hello"] = f;// f 隐式转换为 std::function
wizardforcel
2018-02-20 21:06:41 +08:00
@q397064399 lambda 实际上就是 operator() ,但是你定义结构体的时间我都把 lambda 写好了。
q397064399
2018-02-20 21:10:30 +08:00
@wizardforcel #13 我是觉得蠢办法好使,也容易改,C++就是各种特性 搞来搞去 把语言给搞复杂了
bramblex
2018-02-20 21:14:15 +08:00
@q397064399

但是有好用的特性干嘛不用,楼上说的好呀,都 2018 年了,c 艹 11 都不用上吗?
ipwx
2018-02-20 21:28:30 +08:00
@snnn 函数指针不能绑定局部产生的参数,这个很麻烦。还是 std::function 好使。

不过 @fyyz 像函数对象这种可能会有很大的上下文的对象,我觉得还是用 shared_ptr 更好,不然会产生对闭包的多次拷贝。如果闭包还有文件对象什么的,不是要跪了。
gnaggnoyil
2018-02-20 21:59:20 +08:00
@geelaw 讲道理"形参"没有"接受"这一说吧.严格的说法应该是"参数列表能接受(param_1 左值,param_2 左值)"大概?
geelaw
2018-02-20 22:18:02 +08:00
@gnaggnoyil 应该是:能接受 param_1 &, param_2 & 的实参。
gnaggnoyil
2018-02-20 22:21:26 +08:00
@geelaw 实参本身作为表达式其类型不能是引用类型的,对,就算是由指向某个引用的单个名字构成的 id-expression 也不能.
sinxccc
2018-02-20 23:13:54 +08:00
C++ 的设计哲学和有点本来就是可以让人根据自己的需要灵活选择特性,而不是被语言绑架啊。

用函数指针还是 std::function 显然都行,这有什么可争的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/431350

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX