1

我遇到的问题是我想在模板类中使用 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

先感谢您!

4

5 回答 5

5

您正在尝试在需要函数指针的地方混合成员函数指针。您可以将谓词重构为一个static函数,或者使用绑定将您的成员函数指针与您的类的实例相关联mesh

为了将实例绑定到您的成员函数指针,您可以这样做

std::bind( mesh_instance, &mesh::compareEdgesFromIndex, _1, _2 )

如果使用C++11。如果您没有奢侈品,那么您可以使用Boost的等效功能(替换std::bindboost::bind)。C++03提供了一些绑定功能,但它是有限的,我相信现在通用绑定功能已经过时了。

于 2012-06-04T18:13:13.010 回答
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被调用的指针。

于 2012-06-04T18:08:34.317 回答
3

或者,如果您希望使用 compareEdgesFromIndex 作为非静态成员函数,您可以boost::bind(this, &mesh::compareEdgesFromIndex, _1, _2)作为比较器传递。

于 2012-06-04T18:16:39.600 回答
1

成员函数不是函数,因为要工作,它还需要知道正在作用的对象实例是哪个。静态成员基本上只是一个普通的全局函数,具有一个有趣的名称和访问类私有部分的权限。

实际上,指向非静态成员函数的指针不是您可以简单调用的东西,而是您可以提供对象实例来获取可以调用的东西的东西。

您可以改为传递std::sort一个实现给定两个索引的类的对象实例::operator()(int, int),该实例将返回所需的结果。不幸的是,由于我在 C++ 中从未理解过的原因,这个对象类必须是非本地类,因为本地类不能在模板中使用(它可以是在另一个类中定义的类,但不是在函数或方法中定义的类)。

于 2012-06-04T18:14:03.230 回答
0

作为 . 的替代方法std::bind,您可以使用我更喜欢的 lambda,因为我永远记不起std::bind.

auto cmp = [&mesh_instance](unsigned lhs, unsigned rhs) {
    return mesh_instance.compareEdgesFromIndex(lhs, rhs);
};
于 2012-06-04T18:41:16.867 回答