c ++ - Valg af den korrekte version af en funktion ved hjælp af skabeloner

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en Visual Studio 2008 C ++ applikation til Windows, hvor jeg har pakket nogle platformsfunktioner, der tager TCHAR baserede parametre og derfor har både en bred karakter og en smal version valgt af en 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 );
}


Jeg foretrækker at templatisere dette sådan, at kompilatoren automatisk kan vælge den korrekte version af SomeFunc baseret på hvilken type streng jeg passerer i stedet for en ifdef.


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


Har nogen et forslag til, hvordan dette kan opnås? Fortrinsvis uden at ty til RTTI.

Bedste reference


Dette?


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

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


Den første version vil blive kaldt, medmindre du udtrykkeligt kalder det med en LPCSTR parameter.