c++ - lambda 绑定(bind)问题?

标签 c++ boost bind boost-lambda

我是 boost 的新手。这是我的测试代码,

  using namespace boost::lambda;
  std::vector<std::string> strings; 
  strings.push_back("Boost"); 
  strings.push_back("C++"); 
  strings.push_back("Libraries"); 

  std::vector<int> sizes; 

  std::for_each(
   strings.begin(),
   strings.end(),
   bind(
  &std::vector<int>::push_back,
  sizes,
  bind<std::size_t>(&std::string::size, _1)));

  std::for_each(sizes.begin(), sizes.end(), var(std::cout)<<_1);

构建项目并产生错误:

错误 C2665:“boost::lambda::function_adaptor::apply”:2 个重载中没有一个可以转换所有参数类型

请问这是怎么回事?非常感谢。

最佳答案

第一个问题是std::vector::push_back是C++0x中的重载函数(有左值引用参数的重载和右值引用参数的重载) .

第二个问题是标准库成员函数的类型是未指定的:允许实现者向成员函数添加带有默认参数的额外参数,并且允许他们添加额外的成员函数重载,所以你做的任何转换不会是可移植的。消歧示例假设我们忽略了第二个问题。

您需要将指向成员函数的指针转换为正确的类型,否则这不适用于 C++0x 库实现(指向成员函数的指针将不明确)。你需要:

(void (std::vector<int>::*)(const int&))&std::vector<int>::push_back

使用 C++0x 函数库,以下工作(如果将 std:: 替换为 boost::,它也应该与 Boost 一起工作;我只是无法测试):

std::for_each(
    strings.begin(),
    strings.end(),
    std::bind(
       (void (std::vector<int>::*)(const int&))&std::vector<int>::push_back,
       std::ref(sizes),
       std::bind(&std::string::size, std::placeholders::_1)));

请注意,这是一团糟,使用 for 循环会更清晰:

for(std::vector<int>::const_iterator i(strings.begin()); i != strings.end(); ++i)
{
    sizes.push_back(i->size());
}

或者,如果您有一个支持 lambda 表达式的编译器:

std::for_each(strings.begin(), strings.end(), 
              [&](const std::string& s) { sizes.push_back(s.size()); });

或者,为了更有趣:

std::transform(strings.begin(), strings.end(), std::back_inserter(sizes),
               [](const std::string& s) { return s.size(); });

关于c++ - lambda 绑定(bind)问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4048699/

相关文章:

c++ - BOOST 和 C++ : can't seem to get polymorphism to work

.net - 进程返回值

c++ - std::hash_set vs std::unordered_set,它们是一回事吗?

c++ - 现在我可以替换所有 Date 类吗?

Android:如何使用 BIND_AUTO_CREATE 选项停止由 bindService() 启动的服务?

javascript - MDN 绑定(bind)为什么调用 apply 时连接参数

c++ - 将 std::bind 与 boost::signals2 一起使用是否安全?

c++ - C++目标文件和程序文件 union 编译的Bashrc别名

c++ - 如何正确删除多维 vector ?

c++ - 了解 boost::random statistic-tests 的结果