使用模板选择正确的函数版本

时间:2012-03-13 13:58:25

标签: c++ windows templates wrapper

我有一个适用于Windows的Visual Studio 2008 C ++应用程序,其中包含了一些基于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 );
}

我更喜欢将其模板化,以便编译器可以根据我传入的字符串类型而不是SomeFunc自动选择正确的ifdef版本。

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

是否有人建议如何实现这一目标?最好不要求助于RTTI。

1 个答案:

答案 0 :(得分:0)

此?

template<typename T>
inline DWORD QueryValue( HANDLE h, T str )
{
   //...
}

template<>
inline DWORD QueryValue<LPCSTR>( HANDLE h, LPCSTR str )
{
   //...
}

除非您使用LPCSTR参数明确调用它,否则将调用第一个版本。