使用 std::vector<boost::function> with boost::bind
Using std::vector<boost::function> with boost::bind
在试图适应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
中执行函数应用和文本输出。我错过了什么?
代码的问题是,您试图以一种不允许的方式创建一个函子(您不能在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 ) );
如果你的编译器支持lambdas,你可以这样做:
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";
}
);
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- EASTL矢量<向量<int>>连续的
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 使用 std::vector<boost::shared_ptr<Base_Class>> 或 boost::p tr_vector 的性能注意事项是什么<Base>