2

在尝试适应时boost,偶然发现boost::functionstd::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

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

4

1 回答 1

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 ) );

如果您的编译器支持 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";
               }
);
于 2011-10-02T21:24:47.200 回答