How can I pass a member function where a free function is expected?

后端 未结 9 1773
误落风尘
误落风尘 2020-11-22 15:10

The question is the following: consider this piece of code:

#include 


class aClass
{
public:
    void aTest(int a, int b)
    {
        prin         


        
9条回答
  •  不要未来只要你来
    2020-11-22 15:34

    You can stop banging your heads now. Here is the wrapper for the member function to support existing functions taking in plain C functions as arguments. thread_local directive is the key here.

    http://cpp.sh/9jhk3

    // Example program
    #include 
    #include 
    
    using namespace std;
    
    typedef int FooCooker_ (int);
    
    // Existing function
    extern "C" void cook_10_foo (FooCooker_ FooCooker) {
        cout << "Cooking 10 Foo ..." << endl;
        cout << "FooCooker:" << endl;
        FooCooker (10);
    }
    
    struct Bar_ {
        Bar_ (int Foo = 0) : Foo (Foo) {};
        int cook (int Foo) {
            cout << "This Bar got " << this->Foo << endl;
            if (this->Foo >= Foo) {
                this->Foo -= Foo;
                cout << Foo << " cooked" << endl;
                return Foo;
            } else {
                cout << "Can't cook " <<  Foo << endl;
                return 0;
            }
        }
        int Foo = 0;
    };
    
    // Each Bar_ object and a member function need to define
    // their own wrapper with a global thread_local object ptr
    // to be called as a plain C function.
    thread_local static Bar_* BarPtr = NULL;
    static int cook_in_Bar (int Foo) {
        return BarPtr->cook (Foo);
    }
    
    thread_local static Bar_* Bar2Ptr = NULL;
    static int cook_in_Bar2 (int Foo) {
        return Bar2Ptr->cook (Foo);
    }
    
    int main () {
      BarPtr = new Bar_ (20);
      cook_10_foo (cook_in_Bar);
    
      Bar2Ptr = new Bar_ (40);
      cook_10_foo (cook_in_Bar2);
    
      delete BarPtr;
      delete Bar2Ptr;
      return 0;
    }
    

    Please comment on any issues with this approach.

    Other answers fail to call existing plain C functions: http://cpp.sh/8exun

提交回复
热议问题