2010-12-09 83 views
1

導出的函數我有一個Visual Studio 2008的C++的dll,我想接受可變數量的參數,並知道每一個類型。例如:RTTI在從DLL

__declspec(dllexport) void Foo(const char* object, const char* function, ...) 
{ 
    printf("%s::%s(", object, function); 

    va_list list; 
    va_start(list, function); 

    while(va_arg(list, ???)) 
    { 
     printf("[%s] %s ", type, value); 
    } 

    va_end(list); 
    printf(")\r\n"); 
} 

預期使用是這樣的:

Buzz api; 
int a = 1; 
api.DoSomething(a, "hello", 0.2f); 

Foo("Buzz", "DoSomething", a, "hello", 0.2f); 

當預期輸出應該是這樣的:

Buzz::DoSomething([int] 1, [const char*] "hello", [float] 0.2) 

是這樣的,或者類似的東西,可能與RTTI?如果一個參數可變參數的解決方案是不可能的。(我懷疑它是不是),我可以接受一個包含多個重載1-n個參數。

感謝, PaulH

回答

0

一個可變參數的參數解決方案是可行的,但不是C的方式,而不是在語言的當前版本。如果你的編譯器實現了可變參數模板,你可以用它們來完成。您可以通過具有的默認參數一長串的功能模仿與當前版本升級到一些任意的最大值(由變量設置,如果你使用預處理魔法)可變參數模板。

所以,這取決於你想往哪個方向走,你需要學習可變參數模板和/或預處理。一旦你做了必要的研究,前者將變得明顯。後者有點困難,但是如果你看看src中的東西,比如boost :: function,它就會變得很明顯。

+0

在DLL不可能...有模板沒有運行實例......你不能知道什麼instatiations將是必要的編譯共享庫... – smerlin 2010-12-10 00:03:18

1

第一:在C++中支持「C」風格的可變參數函數以兼容C代碼只有。不建議您在新的C++代碼中使用它們,因爲它們無法強制實現類型安全。

可變參數函數將其所有「...」參數作爲棧中的非類型值傳遞。作爲參數傳遞的值的類型必須由邏輯推導出來(作爲該函數的作者)放入你寫的函數中。也就是說,唯一能告訴printf參數類型的格式字符串本身就是格式字符串。

這是在C作爲真++,因爲它是在C.沒有方法用於RTTI以提供用於在堆棧上的任意值的任何類型的信息。

如果這些值都是指向類層次結構內對象(相關類的實例)的指針,那麼您可以使用dynamic_cast來確定類型......但是您必須自己編寫代碼來處理不同的類,該語言不會爲你做到這一點。