增强范围for_each,bind,copy和back_inserter的组合失败

时间:2016-02-24 16:37:58

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

我想将a中包含的所有整数复制到b

#include <vector>
#include <iterator>
#include <boost/bind.hpp>
#include <boost/range/algorithm/for_each.hpp>
#include <boost/range/algorithm/copy.hpp>
void test()
{
        std::vector<std::vector<int> > a;
        std::vector<int> b;
        boost::for_each(a, boost::bind(boost::copy, _1, std::back_inserter(b)));
}

看起来很简单。我想要一个兼容C ++ 98的内容。

为什么不编译? 我有一长串关于boost::bind的错误清单,我不明白这一点,而且它有多页长。

错误始于:

  

错误C2780:&#39; boost :: _ bi :: bind_t&lt; _bi :: dm_result :: type,boost :: _ mfi :: dm,_bi :: list_av_1 :: type&gt; boost :: bind(M T :: *,A1)&#39; :期望2个参数 - 3提供

1 个答案:

答案 0 :(得分:1)

这里有一个直接相关的问题:Can I use (boost) bind with a function template?。该问题中的错误消息是相同的,问题的不同之处在于它们的模板函数不是库函数。

这里的技巧是你打算绑定模板函数boost::copy<>(),根据链接的问题,这是不可能的,因为必须实例化模板函数才能作为函数指针传递。这也表示here,“绑定模板函数”部分。所以,遗憾的是,你需要求助于一个相当长的构造,使用typedef可以略微缩短(因为你在C ++ 98中,也没有decltype可用):

int main()
{
        typedef std::vector<int> IntVec;
        std::vector<IntVec> a;
        IntVec b;
        boost::for_each(a,
            boost::bind(boost::copy<IntVec,
            std::back_insert_iterator<IntVec> >, _1, std::back_inserter(b)));
}