在尝试使用boost
时感到满意,但在使用boost::function
和std::vector
时遇到了问题。我正在尝试做一件简单的事情:有一个带有similair签名的函数列表,然后在样本数据上使用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
中执行函数应用和文本输出。我错过了什么?认为使用lambdas或smth应该很容易,但无法找出正确的解决方案。
答案 0 :(得分:4)
你的代码的问题在于你试图以一种不允许的方式创建一个仿函数(你不能只在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";
}
);