2016-11-18 6 views
0

同じ入出力型の2つの関数があります。関数は、クラスまたはスタンドアロン関数からの関数へのポインタ

uint32_t doWork(uint32_t time); 
uint32_t MyClass::DoWork(uint32_t time); 

ここで、この関数を別のクラスに挿入して、いずれかの関数を使用する必要があります。

私は関数点を使うことができると思っていましたが、関数ポインタはクラスの型も使用する必要があるため、これは機能しません。

両方の関数を同じ関数ポインタ型に格納してコンストラクタに渡す方法はありますか?

クラスからの関数は静的ではありません。

ご協力いただきましてありがとうございます。

+0

クラスメンバーを使用する場合は、どのオブジェクトを操作するのかをどのように知ることになっていますか? – Barmar

+0

related/dupe:http://stackoverflow.com/questions/30605393/assign-a-member-function-to-a-function-pointer – NathanOliver

+0

余分なレベルの間接化は傷つくでしょうか? – WhiZTiM

答えて

2

私のC++コンパイラで少し実験しました。 は、ここで私はそれが仕事をしているように見える得たものです。これを使用するときに

#include <stdio.h> 

typedef unsigned int uint32_t; 

typedef uint32_t (doWorkPtr) (uint32_t time); 

uint32_t doWork(uint32_t time) { 
    return time*2; 
} 

class MyClass { 
    public: 
    int times; 
    int DoWork(uint32_t time) { return time*times; } 
}; 

struct Adapter { 
    MyClass* a; 
    doWorkPtr* ptr; 
    int operator() (uint32_t time) { 
    if(a) 
     return a->DoWork(time); 
    else 
     return ptr(time); 
    } 
}; 

int main(int argc, char** argv) { 
    Adapter* pointers[2]; 

    MyClass klass; 
    klass.times = 3; 
    Adapter adapter; 
    adapter.a = &klass; 
    adapter.ptr = 0; 

    Adapter adapter2; 
    adapter2.a = 0; 
    adapter2.ptr = &doWork; 

    pointers[0] = &adapter; 
    pointers[1] = &adapter2; 

    printf("result1 %i\n", (*pointers[0])(1)); 
    printf("result2 %i\n", (*pointers[1])(1)); 

    return 0; 
} 

あなたのクラスではなく、プレーン関数ポインタの「アダプター」のポインタを格納します。

希望すると助かります!

関連する問題