gpt4 book ai didi

c++ - boost::bind 不适用于 boost::tuple::get()

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:37 25 4
gpt4 key购买 nike

我正在尝试使用 boost::bind和 STL 与 boost::tuple ,但每次我尝试编译时都会收到以下错误。

      error: call of overloaded ‘bind(<unresolved overloaded function type>, 
boost::arg<1>&)’ is ambiguous

你知道我在这里做错了什么吗?为什么只针对 boost::arg<1>

谢谢AFG

    #include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <boost/tuple/tuple.hpp>
#include <boost/assign.hpp>
#include <boost/bind.hpp>

int main( int argc, const char** argv ){


using namespace boost::assign;
typedef boost::tuple< int, double > eth_array;

std::vector< eth_array > v;
v+= boost::make_tuple( 10,23.4), boost::make_tuple( 12,24.4) );
std::for_each( v.begin()
, v.end()
, boost::bind<int>(
printf
, "%d-%f"
, boost::bind( eth_array::get<0>, _1 )
, boost::bind( eth_array::get<1>, _1 )
)
);

最佳答案

get函数有多个模板参数:除了索引之外,它还根据元组的内容(cons 的头和尾)进行参数化。

因此,get<0>不是模板的实例化;您需要提供额外的参数:

typedef eth_array::head_type head;
typedef eth_array::tail_type tail;

... get<0, head, tail> ...

但是,这仍然行不通,因为 get已重载(const 和非常量版本),因此您需要明确说明您想要的重载。为此,您需要使用具有正确类型的函数指针:

// const version of get, which takes and returns const references
int const & (*get0)( boost::tuples::cons<head, tail> const & ) =
boost::get<0, head, tail>;
double const & (*get1)( boost::tuples::cons<head, tail> const & ) =
boost::get<1, head, tail>;

现在您可以在绑定(bind)表达式中使用这些函数指针:

std::for_each( v.begin(),
v.end(),
boost::bind<int>(
printf,
"%d-%f",
boost::bind( get0, _1 ),
boost::bind( get1, _1 )
)
);
// outputs 10-23.40000012-24.400000

如您所见,重载函数模板和bind相处得不是很好……

关于c++ - boost::bind 不适用于 boost::tuple::get<N>(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7157210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com