2012-03-13 4 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); 
} 

Я предпочел бы templatize это такое, что компилятор может автоматически выбрать правильную версию SomeFunc на основе того, какой тип строки я прохожу в а не ifdef.

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

Есть ли у кого-нибудь предложение о том, как это можно сделать? Предпочтительно, не прибегая к RTTI.

ответ

0

Это?

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

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

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

+0

Да ... конечно. Специализация шаблона - именно то, что мне нужно. – PaulH

+0

Зачем вам нужно создать шаблон? Конечно, перегрузки достаточно. –

+0

@MikeSeymour, это была моя первая мысль, но она не может решить, между двумя, если вы передадите ей указатель NULL. ;) –

Смежные вопросы