如何解决如何从成员函数的指针生成比较函数?
为STL算法和容器编写比较功能很繁琐。
对于诸如此类的简单对象,
struct Person
{
int id;
string name;
string surname;
string get_full_name(); // name then surname
};
我必须为lhs
和rhs
输入相同的函数调用:
vector<Person> v = { ... };
std::sort( v.begin(),v.end(),[](const Object &lhs,const Object &rhs) {
return lhs.get_full_name() < rhs.get_full_name(); // tedious
} );
我希望能够使用指向成员函数的指针或指向成员数据的指针来构成比较功能/函数。也许是这样:
std::sort( v.begin(),make_compare_functor( &Object::get_full_name ));
std::sort( v.begin(),make_compare_functor( &Object::surname ));
我试图像这样实现它:
template <class R,class T>
struct CompareFunctor {
R (T::*fp)();
bool operator() (const T& lhs,const T& rhs) {
return lhs->*fp() < rhs->*fp();
}
};
// helper function
template <class R,class T>
CompareFunctor<R,T> make_compare_functor(R(T::*fp)()) {
return CompareFunctor<R,T> { fp };
}
但对于其中的任何个实例,它都无法实例化T
auto functor1 = make_compare_functor( &Person::get_full_name );
auto functor2 = make_compare_functor( &std::string::size );
(错误消息类似:'make_compare_functor': no matching overloaded function found ... note: could be 'const Person' or 'Person'
)
请问有人可以指导我如何使用指向成员函数的指针来组成比较函数/功能吗?
最好应该基于STL,没有Boost或其他库。
解决方法
您处在正确的轨道上,但是您需要重载make_compare_functor
才能接受指针到成员函数以及指针到成员。另外,您需要编写一个CompareMember
比较指针到成员,类似于CompareFunctor
比较指针到成员函数的方式:
// compare pointer to member function
template <class R,class T>
struct CompareFunctor {
R (T::*fp)() const;
bool operator() (const T& lhs,const T& rhs) {
return (lhs.*fp)() < (rhs.*fp)();
}
};
// compare pointer to member
template <class T,class M>
struct CompareMember {
M T::*mp;
bool operator() (const T& lhs,const T& rhs) {
return lhs.*mp < rhs.*mp;
}
};
// helper function : compare pointer to member function
template <class R,class T>
CompareFunctor<R,T> make_compare_functor(R(T::*fp)() const) {
return CompareFunctor<R,T> { fp };
}
// helper function : compare pointer to member
template <class T,class M>
CompareMember<T,M> make_compare_functor(M T::*mp) {
return CompareMember<T,M> { mp };
}
这里是demo。
请注意,我在指向成员函数的指针签名中添加了const
,并更正了问题代码中的一些错字。
make_compare_functor
也应该现在重命名为make_compare
,因为它也接受指向成员的指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。