2012-03-13 64 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