Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用模板选择函数的正确版本_C++_Windows_Templates_Wrapper - Fatal编程技术网

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

C++ 使用模板选择函数的正确版本,c++,windows,templates,wrapper,C++,Windows,Templates,Wrapper,我有一个Visual Studio 2008 C++应用程序,用于Windows,其中我封装了一些以 TCHAR 为基础的参数,因此具有宽字符和窄版本,这两种功能都是由 IFDEF > #ifdef UNICODE #define QueryValueW QueryValue #else #define QueryValueA QueryValue #endif inline DWORD QueryValueW( HANDLE h, LPCWSTR str ) { re

我有一个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 );
}
template< typename charT >
inline DWORD QueryValue( HANDLE h, const charT* str )
{
    // Call ::SomeFuncW or ::SomeFuncA depending on the type of `charT`.
}
我更喜欢将其模板化,这样编译器可以根据传入的字符串类型自动选择正确版本的
SomeFunc
,而不是
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 );
}
template< typename charT >
inline DWORD QueryValue( HANDLE h, const charT* str )
{
    // Call ::SomeFuncW or ::SomeFuncA depending on the type of `charT`.
}
模板
内联DWORD查询值(句柄h,常量图表*str)
{
//根据“图表”的类型调用::SomeFuncW或::SomeFuncA。
}
有人对如何实现这一目标有什么建议吗?最好不要诉诸RTTI。

这是什么

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

template<>
inline DWORD QueryValue<LPCSTR>( HANDLE h, LPCSTR str )
{
   //...
}
模板
内联DWORD查询值(句柄h,T str)
{
//...
}
模板
内联DWORD查询值(句柄h,LPCSTR str)
{
//...
}

将调用第一个版本,除非使用
LPCSTR
参数显式调用它。

Yes。。。当然模板专门化正是我所需要的。为什么需要将其作为模板?当然重载已经足够了。@MikeSeymour这是我的第一个想法,但是如果你给它传递一个空指针,它无法在两者之间做出决定。;)