выбор правильной версии функции с использованием шаблонов - PullRequest
0 голосов
/ 13 марта 2012

У меня есть приложение 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 );
}

Я бы предпочел шаблонизировать это так, чтобы компилятор мог автоматически выбрать правильную версию 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 голосов
/ 13 марта 2012

Это?

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

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

Первая версия будет вызвана, если вы явно не вызовете ее с параметром LPCSTR.

...