提升范围 for_each、绑定、复制和 back_inserter 的组合失败
Combination of boost range for_each, bind, copy and a back_inserter fails
我想将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 兼容的 one liner。
为什么不能编译?
我有一长串关于 boost::bind
的错误,我不明白,而且它有好几页那么长。
错误以 :
开头
error C2780: 'boost::_bi::bind_t<_bi::dm_result::type,boost::_mfi::dm,_bi::list_av_1::type> boost::bind(M T::* ,A1)' : expects 2 arguments - 3 provided
这里有一个直接相关的问题: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)));
}
我想将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 兼容的 one liner。
为什么不能编译?
我有一长串关于 boost::bind
的错误,我不明白,而且它有好几页那么长。
错误以 :
开头error C2780: 'boost::_bi::bind_t<_bi::dm_result::type,boost::_mfi::dm,_bi::list_av_1::type> boost::bind(M T::* ,A1)' : expects 2 arguments - 3 provided
这里有一个直接相关的问题: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)));
}