【问题标题】:Return a function pointer from a class member function从类成员函数返回函数指针
【发布时间】:2018-05-22 13:30:32
【问题描述】:

我有如下类 AbstractOdeSolver:

class AbstractOdeSolver
{
private:
    double (*rightHandSide)(double y,double t);

public:
    AbstractOdeSolver(int nop,double initime, double fintime, double initval, double(*pf)(double,double));
    double (*GetRightHandSide)(double y, double t)();
};

所以我有一个带有私有成员函数指针的类,即 rightHandSide,我想从成员函数中返回它。所以...

  1. 我不知道代码的最后一行是否定义了我想要定义的内容,但我在写这个答案时考虑了Returning function pointer type

  2. 如果最后一行是正确的,那么我想知道如何在AbstractOdeSolver.cpp 中编写实现?我试过了:

    double (*AbstractOdeSolver::GetRightHandSide)(double y, double t)()
    

    但即使是编辑器(Kdevelop)也不接受这一点,我认为通过一个小的修订,它被称为指向成员函数的指针而不是指向函数的指针。

请注意,我想返回一个指向函数的指针,该函数需要两个双精度和 返回一个双精度,如果不能完成也没关系。

【问题讨论】:

  • 我知道这两件事不是一回事,但我看到我粘贴的链接,我认为可以按照我的想法完成。另外我不想使用 std::function 如果可能的话,我想要更简单的东西。谢谢@Someprogrammerdude
  • 我想我误解了你的问题。但是为什么你不想使用std::function?使用std::function,您不仅限于非成员函数或非捕获 lambda。使用std::function,您可以像对待任何其他对象一样处理对象(例如std:vectorstd::string),并且您可以轻松返回或复制。
  • “但这不被接受”。显示错误消息。
  • @Someprogrammerdude 我想在没有现有课程的情况下解决它,如果我在我粘贴在我的问题上的链接中找不到类似答案的解决方案,我将立即使用 std::function 因为我已阅读有关此内容。再次感谢您。
  • @Jarod42 在编辑器中,该函数为红色,并写了一些关于“{”的内容。

标签: c++ pointers


【解决方案1】:

IIUC你想要什么,最简单的方法是使用typedef

class AbstractOdeSolver 
{
public:
    typedef double (*FSolver)(double, double);
    ....
    FSolver GetRightHandSide();
};
....
AbstractOdeSolver::FSolver AbstractOdeSolver::GetRightHandSide()
{ 
    // just for an example:
    return +[](double, double) -> double { return 0.0; }    
}

没有typedef也一样:

class AbstractOdeSolver
{
public:
    double (* GetRightHandSide())(double, double);
};

double (*AbstractOdeSolver::GetRightHandSide())(double, double)
{
    return +[](double, double) -> double {return 0.0; };
}

并按照@Jarod42 的建议使用尾随返回类型:

class AbstractOdeSolver
{
public:
    auto GetRightHandSide() -> double (*)(double, double);
};

auto AbstractOdeSolver::GetRightHandSide() -> double (*)(double, double)
{
    return +[](double, double) -> double {return 0.0; };
}

【讨论】:

  • 你认为没有 typedef 可以做到这一点......类似于我粘贴到我上面的问题的链接?
  • 尾随返回类型帮助:auto AbstractOdeSolver::GetRightHandSide() -> double (*)(double, double).
  • @user2807083 如果你知道 告诉我这个难以理解的解决方案真是太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多