问题描述
我正在转换一个C ++项目,该项目使用boost和占位符来转换地图,而现有逻辑是:
inline const std::vector<uint32_t> average(const std::pair<uint16_t,std::vector<uint32_t> >& left,const std::pair<uint16_t,std::vector<uint32_t> >& right)
{
// Ejector rates should be symmetrical
assert(left.second.size() == right.second.size());
std::vector<uint32_t> result;
result.reserve(left.second.size());
namespace bl = boost::lambda;
// Walk both,do funny thing with each element in turn. Stuff into result.
std::transform(left.second.begin(),left.second.end(),right.second.begin(),std::back_inserter(result),(bl::_1 + bl::_2) / 2);
return result;
}
我想用std替换boost引用:
inline const std::vector<uint32_t> average(const std::pair<uint16_t,(std::placeholders::_1 + std::placeholders::_2) / 2);
return result;
}
我得到:
error C2784: 'std::_Deque_const_iterator<_Mydeque> std::operator +(_Deque_const_iterator<_Mydeque>::difference_type,std::_Deque_const_iterator<_Mydeque>)' : Could not deduce template argument for 'std::_Deque_const_iterator<_Mydeque>' from 'std::_Ph<2>'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\deque(555) : see declaration of 'std::operator +'
在包含以下内容的行上:
(std::placeholders::_1 + std::placeholders::_2) / 2);
正确的方法是什么?
解决方法
使用lambda。
std::transform(left.second.begin(),left.second.end(),right.second.begin(),std::back_inserter(result),[](auto a,auto b){ return (a + b) / 2; });
,
只需使用lambda。
通常,您可以使用const auto refs
来避免参数的使用:
std::transform(left.second.begin(),[] (auto const &a,auto const &b) { return (a+b)/2; });
对于较小的数字类型,例如int
,您可以按值传递它们,而仅使用const auto
或明确指定类型:
std::transform(left.second.begin(),[] (uint32_t a,uint32_t b) { return (a+b)/2; });