2012-03-13 62 views
0

我有一個Visual Studio 2008 C++應用程序的Windows,我已經包裝了一些基於TCHAR的參數,因此具有寬字符和窄版本的ifdef使用模板選擇功能的正確版本

#ifdef UNICODE 
    #define QueryValueW QueryValue 
#else 
    #define QueryValueA QueryValue 
#endif 

inline DWORD QueryValueW(HANDLE h, LPCWSTR str) 
{ 
    return ::SomeFuncW(h, 0, true, str, 0, 0); 
} 

inline DWORD QueryValueA(HANDLE h, LPCSTR str) 
{ 
    return ::SomeFuncA(h, 0, true, str, 0, 0); 
} 

我寧願模板化這使得基於我傳遞,而不是ifdef什麼類型的字符串的編譯器可以自動選擇SomeFunc正確的版本。

template< typename charT > 
inline DWORD QueryValue(HANDLE h, const charT* str) 
{ 
    // Call ::SomeFuncW or ::SomeFuncA depending on the type of `charT`. 
} 

有沒有人有關於如何完成的建議?最好不訴諸於RTTI。

回答

0

This?

​​3210

第一個版本將被調用,除非你明確地用LPCSTR參數調用它。

+0

是的......當然。模板專業化正是我所需要的。 – PaulH 2012-03-13 14:29:24

+0

爲什麼你需要將其作爲模板?超載肯定是足夠的。 – 2012-03-13 15:11:15

+0

@MikeSeymour這是我的第一個想法,但它不能決定之間,如果你傳遞給它一個NULL指針。 ;) – 2012-03-13 15:11:54