book::bindのいくつかの使用
1752 ワード
1.bootst:bindと関数オブジェクトの結合使用:
このような関数オブジェクトがあります.
a)とstd::logical_notの結合
このような関数オブジェクトがあります.
template <typename _Ty>
struct iStrLess : public std::binary_function<_Ty, _Ty, bool>
{
public:
bool operator () (const _Ty& left, const _Ty& right) const
{
_Ty ileft = boost::to_upper_copy(left);
_Ty iright = boost::to_upper_copy(right);
return (ileft < iright);
}
};
bootstとの併用時の一例:typedef StringUtility::iStrEqual<std::string> iStrEqual_t;
iStrEqual_t strComp;
if (std::find_if(paramNames.begin(), paramNames.end(),
boost::bind(&iStrEqual_t::operator(), &strComp, colName, _1))
== paramNames.end())
{
// to do something
}
2.book:bindとSTLのfunctorの結合使用:a)とstd::logical_notの結合
BOOST_AUTO(itFound, std::find_if(cellmarkers.begin(), cellmarkers.end(),
boost::bind<bool>(std::logical_not<bool>(), boost::bind(&SomeClass::containedIn, _1, boost::cref(cellbox)))));
if (itFound != cellmarkers.end()) return true;
以下のコードセグメントに相当します.for (BOOST_AUTO(it, cellmarkers.begin()); it != cellmarkers.end(); ++it)
{
if (!it->containedIn(cellbox)) return true;
}
b)とstd::equal_トの結合std::vector<SomeClass>::iterator it = std::find_if(vObjs.begin(), vObjs.end(),
boost::bind<bool>(std::equal_to<int>(), cellsetID,
boost::bind(&SomeClass::GetClipSetId, _1)
)
);
以下のコードセグメントに相当します.for (BOOST_AUTO(it, vObjs.begin()); it != vObjs.end(); ++it)
{
if (it->GetClipSetId() == cellsetID)
{
// do something
break;
}
}
注意:外部のbook:bindは返却パラメータを明示する必要があります.内部のものは不要です.