Const函数指针

const function pointers

本文关键字:指针 函数 Const      更新时间:2023-10-16

我对函数指针有一些困难。我有一个基类,它定义了一个函数指针,通过typedef double (*function)(double *x) const;

  • 一个快速的侧面问题:为什么上面的类型定义不编译?

    错误:' const '和' volatile '函数

对于下面的部分,我使用typedef double (*function)(double *x)。现在,每个子类都可以实现该类型函数的多个不同版本。通过枚举选择我所选择的函数,它将非成员函数指针(在基类中定义)设置为由子类的这些成员函数指针之一初始化。下面是一个代码片段:

子类的源文件:

PndLmdROOTDataModel1D::PndLmdROOTDataModel1D(interpolation_type intpol_type) {
  if(intpol_type == CONSTANT) {
    setModelFunction(&PndLmdROOTDataModel1D::evaluateConstant); 
  }
  else if (intpol_type == SPLINE) {
    setModelFunction(&PndLmdROOTDataModel1D::evaluateSpline);
  }
  else {
    setModelFunction(&PndLmdROOTDataModel1D::evaluateLinear);
  }
}

和基类(头文件):

class MultiModel1D: public Model1D {
protected:
  function model_func;
public:
  MultiModel1D();
  virtual ~MultiModel1D();
  void setModelFunction(function f);
}

编译时,我得到以下错误:

注意:参数1与' double '没有已知的转换(PndLmdROOTDataModel1D::*)(double*) ' to '函数{也就是double(*)(双*)}'

我正在使用函数指针,因为速度问题(至少我认为这应该比不断运行一些开关情况更快)。我做错了什么?也许还有一些设计模式可以作为更好的选择……提前感谢!

史蒂夫

这是因为(自由)函数指针和成员函数指针之间存在根本的区别。你的"附带问题"已经包含了问题的提示。要进行解释,您可以这样做:

typedef double (SomeClass::*function)(double *x) const;

typedef double (*function)(double *x);

但是非成员函数永远不能在函数级别声明为const。这些类型不能相互转换,这是编译器在你的代码中指出的问题。

如果它们可以转换,就会出现一个问题:成员函数指针告诉编译器需要调用一个对象,该对象将在调用成员函数时放入this中。如果可以将指针强制转换为普通函数指针,则该对象将丢失,并且可能导致所有参数混乱。所以,不,你真的不能直接选演员。实际情况甚至更复杂(多重/虚拟继承),但是您可以了解到……

出于同样的原因,我们不应该写:

void foo() const
{
   // ...
}

在类声明之外。非成员函数不能为const

你的函数指针是一个普通的函数指针,而不是指向成员函数的指针,因此,const在那里没有意义。