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