将“std::sort”与模板化类中的成员函数一起使用
Using `std::sort` with a member function in a templated class
我遇到的问题是我想在模板化类中使用带有自定义比较函数的 STL 排序。
使用typedef的想法来自另一个Stackoverflow帖子。
无论如何,这是代码:
template <typename R,typename S>
class mesh{
/* some stuff */
void sortData(){
typedef bool (*comparer_t)(const S,const S);
comparer_t cmp = &mesh::compareEdgesFromIndex;
sort(indx,indx+sides*eSize,cmp);
}
/* more stuff */
// eData and cIndx are member variables
bool compareEdgesFromIndex(const S a,const S b){
return compareEdges(eData[cIndx[2*a]],eData[cIndx[2*a+1]],eData[cIndx[2*b]],eData[cIndx[2*b+1]]);
}
};
我得到的错误是
mesh.h:130:29: error: cannot convert ‘bool (mesh<float, unsigned int>::*)(unsigned int, unsigned int)’ to ‘comparer_t {aka
bool (*)(unsigned int, unsigned int)}’ in initialization
提前谢谢你!
您正在尝试在需要函数指针的地方混合使用成员-函数-指针。可以将谓词重构为static
函数,也可以使用绑定将成员函数指针与类mesh
的实例相关联。
为了将实例绑定到您的成员函数指针,您需要这样做
std::bind( mesh_instance, &mesh::compareEdgesFromIndex, _1, _2 )
如果使用 C++11。如果您没有奢侈,那么您可以使用 Boost 中的等效功能(将std::bind
替换为 boost::bind
)。C++03 提供了一些绑定功能,但它是有限的,我相信现在通用绑定功能可用已经过时了。
您必须将compareEdgesFromIndex
声明为静态:
static bool compareEdgesFromIndex(const S a,const S b){
return compareEdges(eData[cIndx[2*a]],eData[cIndx[2*a+1]],eData[cIndx[2*b]],eData[cIndx[2*b+1]]);
}
假设compareEdges
也是静态的。否则,您将有一个成员函数指针,该指针需要调用mesh
指针。
,如果您希望将 compareEdgesFromIndex 用作非静态成员函数,则可以将 boost::bind(this, &mesh::compareEdgesFromIndex, _1, _2)
作为比较器传递。
成员函数不是函数,因为要工作,它还需要知道哪个是正在操作的对象实例。静态成员基本上只是一个常规的全局函数,具有有趣的名称和访问类私有部分的权限。
事实上,指向非静态成员函数的指针不是你可以简单地调用的东西,而是你可以提供一个对象实例来获取你可以调用的东西的东西。
您可以std::sort
类的对象实例传递,该类实现给定两个索引将返回所需结果的::operator()(int, int)
。不幸的是,由于我从未理解的原因,这个对象类必须是非本地类C++因为本地类不能在模板中使用(它可以是在另一个类中定义的类,但不能是在函数或方法中定义的类)。
作为std::bind
的替代方案,您可以使用我更喜欢的lambda,因为我永远记不住std::bind
的语法。
auto cmp = [&mesh_instance](unsigned lhs, unsigned rhs) {
return mesh_instance.compareEdgesFromIndex(lhs, rhs);
};
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法