2016-11-18 39 views
0

我有兩個具有相同輸入和輸出類型的函數。函數指針從一個類或獨立函數中起作用

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

現在我想依賴注入這個函數到另一個類來使用其中一個函數。

所以我想我可以使用一個功能點,但這是行不通的,因爲函數指針需要使用類類型。

是否有任何方法可以將這兩個函數存儲在相同的函數指針類型並將其傳遞給構造函數?

該類的函數不是靜態的。

任何幫助表示讚賞!

+0

如果您使用類成員,它應該如何知道要對哪個對象進行操作? – Barmar

+0

相關/ 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; 
} 

你的類將使用這個存儲的時候,而不是普通函數指針「適配器」指針。

希望它有幫助!