我遇到的问题是我想在模板化的类中使用STL的自定义比较函数排序。
使用typedef的想法来自另一个Stackoverflow Post
无论如何,这是代码:
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
提前谢谢!
答案 0 :(得分:5)
您正在尝试混合成员函数指针,其中需要函数指针。您可以将谓词重构为static
函数,或使用绑定将成员函数指针与类{{1}的实例相关联}}
为了将实例绑定到 member-function-pointer ,你可以
mesh
如果使用 C ++ 11 。如果您没有奢侈品,那么您可以使用 Boost 中的等效功能(将std::bind( mesh_instance, &mesh::compareEdgesFromIndex, _1, _2 )
替换为std::bind
)。 C ++ 03 提供了一些绑定功能,但它有限,而且我认为已过时现在可以使用通用绑定功能。
答案 1 :(得分:3)
您必须将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
指针。
答案 2 :(得分:3)
或者,如果您希望将compareEdgesFromIndex用作非静态成员函数,则可以将boost::bind(this, &mesh::compareEdgesFromIndex, _1, _2)
作为比较器传递。
答案 3 :(得分:1)
成员函数不是函数,因为要工作它还需要知道哪个是被操作的对象实例。 静态成员基本上只是一个常规的全局函数,具有有趣的名称和访问该类私有部分的权限。
实际上,指向非静态成员函数的指针不是您可以简单调用的东西,而是可以提供对象实例以获取可以调用的内容的东西。
您可以通过std::sort
传递一个实现::operator()(int, int)
的类的对象实例,给定两个索引将返回所需的结果。不幸的是,由于我从未在C ++中理解过这个对象类必须是非本地类,因为本地类不能在模板中使用(它可以是在另一个类中定义的类,但不是在函数或方法中定义的类)。 / p>
答案 4 :(得分:0)
作为std::bind
的替代方案,您可以使用我更喜欢的lambda,因为我永远不会记住std::bind
的语法。
auto cmp = [&mesh_instance](unsigned lhs, unsigned rhs) {
return mesh_instance.compareEdgesFromIndex(lhs, rhs);
};