【问题标题】:Function pointers and C++ templates函数指针和 C++ 模板
【发布时间】:2011-12-08 18:06:56
【问题描述】:

我有一个 C++ 代码,我真的需要在其中使用 C 函数:

int procedure(... , S_fp fun , ...)

其中 fun - 是指向函数的指针,其签名必须是这样的:

int fun(double* , double* , double)

函数,我要使用的指针,是类模板的成员:

template<int nPar> class PenaltyAlgorithm
{
public:
...
int Calculate(double* param, double* val, double prec)
{
   ...
}
...
}

如您所见,它的签名是有序的。但是当我这样做时: 过程(... &PenaltyAlgorithm::Calculate, ...);

我得到错误:

error: cannot convert ‘int (PenaltyAlgorithm<30>::*)(double*, double*, double)’ to ‘int (*)(...)’ for argument ...

请帮忙。如果您需要任何其他信息,请写信。

谢谢!!!

阅读答案后,我明白添加有关课程的信息很重要:

template<int nPar> class PenaltyAlgorithm
{
public:
int Calculate(double* param, double* val, double prec)
    {
    *val = comp_fun->Compute(param);
    }

double* RunAlgorithm()
    {
        ...
        procedure(... &PenaltyAlgorithm<nPar>::Calculate, ...);
        ... 
    }
...
private:
...
CompositeFunction<nPar>* comp_fun;
}

1)。我不能使用静态乐趣,因为这种乐趣需要获得类成员的访问权限;

2)。我们可以使用我们从类有趣成员中调用“程序”这一事实吗?

【问题讨论】:

  • 在类上调用函数会传递一个隐式 this 指针,因此您的签名显然是错误的。你应该阅读the C++ FAQ

标签: c++ c templates function pointers


【解决方案1】:

Calculate 是 PenaltyAlgorithm 上的一种非静态方法。它需要一个 PenaltyAlgorithm 的实例来执行,因此它不能作为普通函数指针提供给 C 函数。

Calculate 函数可以设为静态吗?如果可以,它应该和 C 函数指针一样工作,只是它不能访问 PenaltyAlgorithm 类中的非静态数据。

【讨论】:

    【解决方案2】:

    请记住,int Calculate(double* param, double* val, double prec) 作为实例成员有一个隐藏的this 指针,而全局函数或静态成员则没有。没有这个,它就不会知道在哪个PenaltyAlgorithm 上运行它。

    指针应该是int (PenaltyAlgorithm::*)(double* param, double* val, double prec) 类型,或者Calculate 应该是静态的。

    【讨论】:

      【解决方案3】:

      如果int procedure(... , S_fp fun , ...) 肯定是一个C 函数,那么就没有办法直接做你要找的东西。如果你尝试传递一个类成员函数指针,它将隐藏 this 指针作为它在堆栈中的第一个参数,因此原型将不匹配。

      但是,您可以创建一个全局或静态函数,该函数在内部使用保存的实例指针间接访问PenaltyAlgorithm 类。 您可以尝试以下方法:

      1) 将要传递给procedure 函数的类的实例指针保存到一个全局变量中。

      2) 新建全局函数int CalculateGlobal(double* param, double* val, double prec)

      3) 将CalculateGlobal 函数的指针作为函数指针传递给您的procedure 函数。

      4) CalculateGlobal 函数然后可以使用保存的实例指针来访问特定类的内部。

      这当然不是一个好的做事方式......

      【讨论】:

        【解决方案4】:

        除非它是静态成员函数,否则不能将这样的指针传递给成员函数。

        【讨论】:

          【解决方案5】:

          你必须将Calculate设为静态,使用

          static int Calculate(double* param, double* val, double prec)
          

          而不是

          int Calculate(double* param, double* val, double prec)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-07
            • 1970-01-01
            相关资源
            最近更新 更多