簡體   English   中英

將成員 function 指針傳遞給另一個成員 function 內的非成員 function

[英]Passing a member function pointer to a non-member function within another member function

我有一個類似於下面最小示例的代碼,其中 function g由庫提供,並期望double (*)(double)作為參數。 我無法改變這一點。 示例代碼無法編譯,因為該成員具有簽名double (*C::)(double) ,如本文中所述,有多種可能的解決方案。

#include <iostream>

double g(double (*f)(double x)) { return f(0); };

class C
{   
   public:
      C(double b) { a = b; };
      double f2() { return g(&f1); };
   private:
      double a;
      double f1(double x) { return x + a; };
};

int main()
{
   C c (1);
   std::cout << c.f2() << std::endl;
   return 0;
}

我想知道實現這一點的最佳方法是什么,因為我不想指向C::f1在 class 之外但在另一個成員 function 內。 As far as I understand, the member function C::f1 is not static since it is only fully known after an instance of the class is initialised. 由於速度也是一個問題:對於其他地方針對此問題的類似版本提出的任何可能的解決方案,這是否會成為問題?

使您的f1 function static

  static double f1(double x) { return x + a; };

這使它與您的g function 期望的簽名相同。 由於static function 沒有隱藏的this指針,因此您必須找到其他方法來獲取a的值。

好的,根據前面提到的帖子的評論和想法,我建議將g更改如下並添加一個包裝器 function f2_wrapper

#include <iostream>

double g(double (*f)(double x, void *context), void *context)
{
   return f(0, context);
};

class C
{   
    public:
        C(double b) { a = b; };
        double f1(double x) { return x + a; };
        double f2();
    private:
        double a;
};

double f2_wrapper(double x, void* context)
{
    C *c = (C*) context;
    return c->f1(x);
}

double C::f2() { return g(&f2_wrapper, this); }

int main()
{
    C c (1);
    std::cout << c.f2() << std::endl;
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM