gpt4 book ai didi

c++ - 将 std::vector 与 boost::bind 结合使用

转载 作者:搜寻专家 更新时间:2023-10-31 01:17:59 31 4
gpt4 key购买 nike

在尝试适应 boost 的同时, 在使用 boost::function 时遇到了问题连同 std::vector .我正在尝试做一件简单的事情:拥有一个具有相似签名的函数列表,然后将所有这些函数与 std::for_each 一起使用关于样本数据。这是代码:

typedef boost::function<int (const char*)> text_processor;
typedef std::vector<text_processor> text_processors;
text_processors processors;
processors.push_back(std::atoi);
processors.push_back(std::strlen);

const char data[] = "123";

std::for_each(processors.begin(), processors.end(),
std::cout << boost::bind(&text_processors::value_type::operator(), _1, data)
<< "\n"
);

因此,使用 for_each我正在尝试将每个函数应用于示例数据的结果写入标准输出。但它不会像这样编译(关于 << 结果缺少运算符 bind 的一些长消息)。

如果我删除流运算符,那么我将得到可编译但无用的代码。诀窍是我想在单个 for_each 中进行函数应用和文本输出。 .我错过了什么?认为使用 lambda 或类似的东西应该很容易,但无法找出正确的解决方案。

最佳答案

您的代码的问题是您试图以不允许的方式就地创建仿函数(您不能只在 for_each 的第三个参数处抛出代码,您需要通过一个仿函数)。

如果编译器不支持 lambda,您可以使用 std::transform 而不是 std::for_each(未测试...但这应该可以工作):

std::transform( processors.begin(), processors.end(),
std::ostream_iterator<int>( std::cout, "\n" ),
bind( &text_processors::value_type::operator(), _1, data ) );

如果您的编译器支持 lambda,您可以使用它:

const char data[] = "123";
std::for_each(processors.begin(), processors.end(),
[&data]( text_processors const & ) {
std::cout << boost::bind(&text_processors::value_type::operator(), _1, data)
<< "\n"
}
);

但是你可以完全避免bind:

std::for_each( processors.begin(), processors.end(),
[&data]( text_processors::value_type & op ) {
std::cout << op( data ) << "\n";
}
);

关于c++ - 将 std::vector<boost::function> 与 boost::bind 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7629230/

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