gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:26:02 26 4
gpt4 key购买 nike

我是 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/

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