为什么我不能在std :: transform中使用std :: get <0>?

螺丝螺母

在尝试编译以下代码时,会将maps键复制vector

map<string, string> mss;
vector<string> vs;

transform(mss.begin(), mss.end(), back_inserter(vs), get<0>);

VS2013不能区分get预期的用途,但是这种更简单的用法可以正常工作:

vs.push_back(get<0>(*mss.begin()));

指定get<0, string, string>没有帮助。我想念什么?

皮特·斯科特尼克

的重载有很多std::get,此外,每个重载本身都是函数模板,因此编译器无法告诉您在呼叫站点上想要哪个地址来请求其中之一的地址。如果您坚持使用std::get,则需要使用static_cast

transform(mss.begin(), mss.end(), back_inserter(vs),
          static_cast<const map<string, string>::key_type&
                         (*)(map<string, string>::value_type&)>(std::get<0>)
                     );

只要instatic_cast的类型匹配作为参数给出的可能函数模板的特殊化的声明,该函数就可以工作。另外,您不应尝试显式指定功能模板(如get<0, string, string>etc)的模板参数-这就是模板参数推导机制的目的。语法不仅丑陋,而且将来还会增加其他重载,从而破坏您的编译。

更好的选择是使用lambda表达式

transform(mss.begin(), mss.end(), back_inserter(vs),
          [](map<string, string>::value_type& p){ return p.first; });

通用Lambda表达式(C ++ 14):

transform(mss.begin(), mss.end(), back_inserter(vs),
          [](auto& p){ return p.first; }); // or `return std::get<0>(p);`

std::mem_fn将其参数绑定到指向数据成员或成员函数的给定指针:

#include <functional>

transform(mss.begin(), mss.end(), back_inserter(vs),
          mem_fn(&map<string, string>::value_type::first));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我不能在std :: vector中使用抽象类?

来自分类Dev

为什么我不能在`std :: initializer_list`中使用引用类型

来自分类Dev

为什么我不能在constexpr lambda函数中使用std :: tuple

来自分类Dev

为什么我不能在 cookie.get 函数之外使用 cookie 变量值?

来自分类Dev

为什么我不能在std :: sets之间移动std :: move std :: unique_ptrs?

来自分类Dev

为什么margin:0不能在按钮上使用?

来自分类Dev

使用std :: get作为std :: transform的参数

来自分类Dev

为什么我不能在C ++ 14的lambda中移动std :: unique_ptr?

来自分类Dev

为什么不能在复制构造函数中使用std :: copy?

来自分类Dev

为什么不能在复制构造函数中使用std :: copy?

来自分类Dev

为什么我的线性渐变不能在Firefox中使用?

来自分类常见问题

为什么我不能在Swift中使用let in协议?

来自分类Dev

为什么我不能在JCreator中使用JavaFX?

来自分类Dev

为什么我不能在TRecord中使用Variable?

来自分类Dev

为什么我不能在MacVim中使用`<和`>?

来自分类Dev

为什么我不能在crontab中使用大括号?

来自分类Dev

为什么我不能在pow()函数中使用整数?

来自分类Dev

为什么我不能在CSS Variable中使用rgba?

来自分类Dev

为什么我不能在Laravel中使用关系方法?

来自分类Dev

为什么我不能在Python中使用“ +”合并字典?

来自分类Dev

为什么我不能在blazor中使用JSInterop?

来自分类Dev

为什么我不能在App Component中使用MyContext?

来自分类Dev

为什么我不能在列表中使用匿名函数?

来自分类Dev

为什么我不能在JCreator中使用JavaFX?

来自分类Dev

为什么我不能在Swift中使用'object == nil'?

来自分类Dev

为什么我不能在Xampp中使用htaccess?

来自分类Dev

为什么我不能在Matlab中使用函数readframe

来自分类Dev

为什么我不能在TRecord中使用Variable?

来自分类Dev

为什么我不能在输入中使用空格字符?

Related 相关文章

  1. 1

    为什么我不能在std :: vector中使用抽象类?

  2. 2

    为什么我不能在`std :: initializer_list`中使用引用类型

  3. 3

    为什么我不能在constexpr lambda函数中使用std :: tuple

  4. 4

    为什么我不能在 cookie.get 函数之外使用 cookie 变量值?

  5. 5

    为什么我不能在std :: sets之间移动std :: move std :: unique_ptrs?

  6. 6

    为什么margin:0不能在按钮上使用?

  7. 7

    使用std :: get作为std :: transform的参数

  8. 8

    为什么我不能在C ++ 14的lambda中移动std :: unique_ptr?

  9. 9

    为什么不能在复制构造函数中使用std :: copy?

  10. 10

    为什么不能在复制构造函数中使用std :: copy?

  11. 11

    为什么我的线性渐变不能在Firefox中使用?

  12. 12

    为什么我不能在Swift中使用let in协议?

  13. 13

    为什么我不能在JCreator中使用JavaFX?

  14. 14

    为什么我不能在TRecord中使用Variable?

  15. 15

    为什么我不能在MacVim中使用`<和`>?

  16. 16

    为什么我不能在crontab中使用大括号?

  17. 17

    为什么我不能在pow()函数中使用整数?

  18. 18

    为什么我不能在CSS Variable中使用rgba?

  19. 19

    为什么我不能在Laravel中使用关系方法?

  20. 20

    为什么我不能在Python中使用“ +”合并字典?

  21. 21

    为什么我不能在blazor中使用JSInterop?

  22. 22

    为什么我不能在App Component中使用MyContext?

  23. 23

    为什么我不能在列表中使用匿名函数?

  24. 24

    为什么我不能在JCreator中使用JavaFX?

  25. 25

    为什么我不能在Swift中使用'object == nil'?

  26. 26

    为什么我不能在Xampp中使用htaccess?

  27. 27

    为什么我不能在Matlab中使用函数readframe

  28. 28

    为什么我不能在TRecord中使用Variable?

  29. 29

    为什么我不能在输入中使用空格字符?

热门标签

归档