【问题标题】:Using std::vector<boost::function> with boost::bind将 std::vector<boost::function> 与 boost::bind 一起使用
【发布时间】:2011-10-02 21:09:06
【问题描述】:

在尝试适应 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,我正在尝试将每个函数应用于样本数据的结果写入标准输出。但它不会像这样编译(一些关于缺少运算符&lt;&lt; 的长消息bind 结果)。

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

【问题讨论】:

    标签: c++ boost boost-bind boost-function


    【解决方案1】:

    你的代码的问题是你试图以一种不允许的方式创建一个仿函数(你不能只在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";
                   }
    );
    

    【讨论】:

    • 感谢您的回复。 std::transform 的解决方案似乎成功了。我试图围绕几个事实:std::cout &lt;&lt; boost::lambda::_1 &lt;&lt; "\n" 是函子,boost::bind(...) 是函子。但我仍然看不到将它们组合在单个函子中以将其传递给 std::for_each 的方法。
    • 我没有使用过 boost lambda 库,而且我已经很久没有阅读文档了,但是 IIRC 有一个 boost::lambda::bind 可能符合您的需求。同样,没有实际经验,您的里程可能会有所不同。
    猜你喜欢
    • 2020-08-03
    • 2023-04-07
    • 1970-01-01
    • 2016-03-16
    • 2011-12-15
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多