【问题标题】:Partial binding with boost::bind使用 boost::bind 进行部分绑定
【发布时间】:2013-12-23 18:28:47
【问题描述】:

所以我拥有的是:

两个范围的元素:

std::vector<int> v1;
std::vector<string> v2;

接受这些范围内元素的函数:

void bar( int x, std::string str );

我想做的是将处理程序应用于 v1 和 v2 的产品中的每一对。所以我得到了这样的东西:

using namespace boost;
for_each( v1, [&]( int x )
    { for_each( v2, bind( bar, x, _1 ) ); } 
);

没关系,但是我必须用 smth else 替换 lambda,因为它们是 C++11 标准的一部分,并且该代码的一些潜在用户仍在使用 C++98。我已经用仿函数替换了 lambda,但后来我想知道是否可以用单行样式重写它,而无需额外的对象和/或函数。 Functor 变体很好,但我想在这里完成探索:)

所以我想要的是这样的:

for_each( v1, for_each( v2, bind( bar, ???, _1 ) ) );

我的第一个想法是绑定内部 for_each 以接收具有类似 void(int) 签名的函数,但这对我来说很难,因为 for_each 只有两个参数 - 字符串范围和接受一个参数的函子 - 字符串。这对我来说意味着我必须在这里使用绑定组合来扩展 for_each 签名,以便它将从第一个范围接收 int 元素。经过一些从 boost::for_each 获取地址的工作后,我来到了这段代码:

typedef boost::function<void(std::string)> StrFunc;
typedef std::vector<std::string> StrRange;

StrFunc maker(int i) {
    return bind( bar, i, _1);
}

for_each(
    v1,
    bind(
        static_cast< StrFunc (*) (const StrRange&, StrFunc)>( 
            for_each<StrRange, StrFunc> ),
        v2,
        bind( maker, _1 )
    )
);

此代码也可以工作 - 一元可调用对象由 maker() 函数创建,其参数组合绑定到内部 for_each。但我仍然有辅助功能。当我试图摆脱它时,我遇到了问题,这对我来说似乎无法解决:

for_each(
    v1,
    bind(
        static_cast< StrFunc (*) (const StrRange&, StrFunc)>( 
            for_each<StrRange, StrFunc> ),
        v2,
        bind( bar, _1, _1 ) //wat?
    )
);

因此,bar() 的第一个绑定参数需要为 _1 才能与外部绑定组合。但是 bar() 的第二个参数也需要为 _1 以便内部 for_each 在循环中使用绑定函数。所以,现在我需要以某种方式组合地绑定第一个参数,并保护第二个参数在绑定时不被评估。

我发现最相关的问题是here,但似乎也无济于事。

各位有什么想法吗?

【问题讨论】:

    标签: c++ boost-bind


    【解决方案1】:

    为什么你不能做一些简单的事情:

    BOOST_FOREACH(int v, v1) { BOOST_FOREACH(字符串 &s, v2) { 条(v,s); } }

    【讨论】:

    • 我当然可以这样做,但我更喜欢尽量减少不必要的宏使用,因此决定编写辅助函数对象。不过,整个问题都是哲学问题——只是建议一些带有 boost::bind 的心理游戏
    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2010-09-21
    • 2016-03-16
    相关资源
    最近更新 更多