2014-03-25 38 views
0

是否有可能創造/生成類似指針聲明:在C++運行時生成函數指針聲明?

void (*foo)(int, float); 

bool (*foo)(); 

char (*foo)(char, int); 

但不知道的參數的類型或返回類型,直到運行時。

函數聲明將從字符串中讀取,該字符串將指定存儲在C++容器中的返回值和參數類型(如果有的話)(如果可能)。

它可以在運行時(不是編譯時)完成嗎?如果需要的話,也可以使用C++ 11。

我真的懷疑這可以用像C++這樣的靜態類型語言來完成,但是如果可以完成,那麼有人會用什麼方法。不需要代碼(但非常感謝),只需指導一下必須使用的內容。

編輯:

測試幾個想法之後事實證明,它不能被(直接)與C++實現的。幸運的是,我找到了dyncall庫,它允許我(間接)在相當多的平臺上做到這一點。

實施例功能:

double sqrt(double x); 

使用dyncall調用的函數:

double r; 
DCCallVM* vm = dcNewCallVM(4096); 
dcMode(vm, DC_CALL_C_DEFAULT); 
dcReset(vm); 
dcArgDouble(vm, 4.2373); 
r = dcCallDouble(vm, (DCpointer)&sqrt); 
dcFree(vm); 

字符串也可用於聲明函數的結構。

C function prototype        dyncall signature 

void f1();           ")v" 
int f2(int, int);         "ii)i" 
long long f3(void*);        "p)L" 
void f3(int**);          "p)v" 
double f4(int, bool, char, double, const char*); "iBcdZ)d" 
+0

據我所知,這是做不到的。 –

+0

所以你有一個字符串。你以某種方式將* something *存儲在從該字符串派生的容器中(它不能是一個聲明 - 這是一個編譯時的概念;你將存儲一些對象)。怎麼辦?這個練習的最終目標是什麼? –

+0

你爲什麼需要這樣做?是否有可能重新設計你的代碼,所以你不需要這樣做? – cup

回答

0

你可以母鹿像

void function (string &arg, …) ; 

,並使用C的可變參數功能++。

儘管你至少需要一個固定參數。

通常,您所描述的並不是C++中的一件好事。

2

它取決於你將處理多少種類型的參數。從技術上講 - 你可以用C++來做所有事情,有時候並不像你希望的那樣簡單。由於您所標記的主題爲C++11,你也可以使用std::function可變參數模板等,以使其更容易

class baseDelegate(){}; 

template<typename retT, typename paramT> 
class delegate: public baseDelegate{ 
    public: 
    retT (*ptr)(paramtT); 
}; 

vector<baseDelegate*> yourDelegateList; 

您可以使用委託模式。上面的代碼只是一個例子。

+0

是的,但std :: function在編譯時也需要它的定義std :: function 。我想過使用它,然後從std :: function :: target_type成員中提取函數定義。 –

+0

我瀏覽了一下,我想我可以用std :: tuple做到這一點。只需使用std :: make_tuple使用我的值構造一個std :: tuple,然後使用std :: tuple_element來提取元素的類型並使用它們生成一個std :: function。我會稍後再嘗試,看看它是否有效,除非有人提供了經過驗證的解決方案。 –

+0

如果您可以確保所有類型都通過參數是內置的或從一個基類派生的,那將會容易得多。在使用委託模式時,你必須知道返回類型和參數類型的所有可能的組合,但我認爲你不能找到更靈活的東西。 –