13,825
社区成员
发帖
与我相关
我的任务
分享
#include <functional>
#include <algorithm>
struct ObjectEqualID : public std::binary_function<Object, DWORD, bool>
{
bool operator ()(Object const& obj, DWORD dwObjID) const
{
return obj.GetObjID() == dwObjID;
}
};
Object_Iter p = std::remove_if(objs.begin(), objs.end(), std::bind2nd(ObjectEqualID(), dwObjID));
template <typename _Pr_>
class binder2nd : public std::unary_function<typename _Pr_::first_argument_type,
typename _Pr_::result_type>
{
public:
binder2nd(_Pr_ pr, _Pr_::second_argument_type value2nd)
: m_pr(pr)
, m_value2nd(value2nd)
{
}
_Pr_::result_type operator ()(_Pr_::first_argument_type value) const
{
return m_pr(value, m_value2nd);
}
private:
_Pr_ m_pr;
_Pr_::second_argument_type m_value2nd;
};
template <typename _Pr_>
binder2nd<_Pr_> bind2nd(_Pr_ pr, typename _Pr_::second_argument_type value)
{
return binder2nd<_Pr_>(pr, value);
}
/*
我在BCB 6.0中测试你上面的调用是可行的(可正常通过编译连接),就是你那个调用STL库的bind2nd
是可行的,不知道你后面是不是自己写了1个binder2nd类模板的代码,我看了下,对于你自己写的binder2nd
类模板的代码中的bind2nd 函数模板的实现部分是有问题的。
我将其该为如下也是可以通过编译连接。
*/
namespace MySpace
{
template <typename _Pr_>
class binder2nd : public std::unary_function<typename _Pr_::first_argument_type,
typename _Pr_::result_type>
{
public:
binder2nd(_Pr_ pr, _Pr_::second_argument_type value2nd)
: m_pr(pr)
, m_value2nd(value2nd)
{
}
_Pr_::result_type operator ()(_Pr_::first_argument_type value) const
{
return m_pr(value, m_value2nd);
}
private:
_Pr_ m_pr;
_Pr_::second_argument_type m_value2nd;
};
/* 这个是我修改后的
template <typename _Pr_,typename _Tp>
inline binder2nd<_Pr_>
bind2nd(const _Pr_& pr, const _Tp& __x)
{
typedef typename _Pr_::second_argument_type _Arg2_type ;
return binder2nd<_Pr_>(pr, _Arg2_type(__x));
}
*/
//这个是你原来自己的
template <typename _Pr_>
binder2nd<_Pr_> bind2nd(_Pr_ pr, typename _Pr_::second_argument_type value)
{
return binder2nd<_Pr_>(pr, value);
}
}
std::remove_if(objs.begin(), objs.end(),MySpace::bind2nd(ObjectEqualID(), dwObjID));