使用 std::vector<boost::function> with boost::bind

Using std::vector<boost::function> with boost::bind

本文关键字:boost gt with bind function lt std vector 使用      更新时间:2023-10-16

在试图适应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结果缺少<<运算符的长消息)。

如果我删除流操作符,那么我将得到可编译但无用的代码。诀窍是我想在单个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";
               }
);