2013-12-18 90 views
0

我是C++中的可變參數模板的新手,所以對於這裏的有經驗的人來說,這個問題可能看起來有些不好。C++ variadic模板 - NULL轉換爲int

我試圖做的是創建一個proxy function,它將能夠使用可變參數模板將我的參數重定向到任何其他函數。

我的代碼如下:

template <typename Ret, typename ... Types> 
Ret proxy_function(Types ... args) 
{ 
    return MessageBoxA(args...); 
} 

int main(int argc, char* argv[]) 
{ 
    boost::any retval = proxy_function<boost::any>(NULL, "123", "456", 0); 
} 

在編譯時,編譯器輸出下列錯誤:

1>Main.cpp(107): error C2664: 'int MessageBoxA(HWND,LPCSTR,LPCSTR,UINT)' : cannot convert argument 1 from 'int' to 'HWND' 

然而,當我提供了下面的代碼只是正常工作:

template <typename Ret, typename ... Types> 
Ret proxy_function(Types ... args) 
{ 
    return MessageBoxA(NULL, args...); 
} 

int main(int argc, char* argv[]) 
{ 
    boost::any retval = proxy_function<boost::any>("123", "456", 0); 
} 

世界上有什麼原因讓編譯器無法將它轉換爲HWND類型嗎?

另一個問題,我腦海中現在有關於這個問題 - 是否有可能找出函數內的參數類型? 我希望能夠做到這一點的東西:

template <typename Ret, typename ... Types> 
Ret proxy_function(Types ... args) 
{ 
    psuedo-code: 
     for arg in args: 
      do_stuff<type(arg)>(arg); 
} 

由於提前,特拉維夫

+7

使用'nullptr'。這就是它存在的原因。 – chris

+0

那麼,對於我的第一個問題 - NULL也定義爲0並且也是(void *)0,因此這兩個類型與HWND不兼容。 快速修復針對此問題將是: INT主(INT的argc,字符* argv的[]){ 升壓 ::任何RETVAL = proxy_function ((HWND)0, 「123」, 「456」, 0); } 但我想強制我的編譯器AUTOMATICALLY使用reinterpret_cast將0轉換爲HWND。 – CodeNinja

+0

如果您有兩個問題,爲什麼不提出兩個不同的問題? – Yakk

回答

3

積分字面值爲0隱含轉換爲指針。但是在調用中,它最終會作爲運行時函數參數,它不是編譯時間常量,因此不會轉換爲空指針(即使它爲0)。使用C++ 11 nullptr


順便說一句,查找「完美轉發」。

2

NULL被定義爲0並且字面0被隱含地轉換爲指針。這導致像剛剛提到的那樣的問題,所以現在有一個新的類型nullptr_t與對象nullptr可以隱式轉換爲任何指針類型,並給出null(小寫代表null的概念,而不是認爲它給了NULL)。

至於在你的特定使用你的第二個問題,你可以使用遞歸像這樣:

template <class T> 
    void do_stuff(T && t){/* stuff here with t*/} 

    template <class T, class ... Ts> 
    void do_stuff(T && t, Ts && ... ts) 
    { 
     /* do stuff with t*/ 
     do_stuff(std::forward<Ts>(ts)...); 
    }