book::bindのいくつかの使用

1752 ワード

1.bootst:bindと関数オブジェクトの結合使用:
このような関数オブジェクトがあります.
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は返却パラメータを明示する必要があります.内部のものは不要です.