Я пишу класс ведения журнала, в котором используется шаблонная функция оператора ‹<. Я специализируюсь на функции шаблона для строки с широкими символами, чтобы я мог сделать некоторый перевод от широкого к узкому перед написанием сообщения журнала. Я не могу заставить TCHAR работать должным образом - он не использует специализацию. Идеи?
Вот соответствующий код:
// Log.h header
class Log
{
public:
template <typename T> Log& operator<<( const T& x );
template <typename T> Log& operator<<( const T* x );
template <typename T> Log& operator<<( const T*& x );
...
}
template <typename T> Log& Log::operator<<( const T& input )
{ printf("ref"); }
template <typename T> Log& Log::operator<<( const T* input )
{ printf("ptr"); }
template <> Log& Log::operator<<( const std::wstring& input );
template <> Log& Log::operator<<( const wchar_t* input );
И исходный файл
// Log.cpp
template <> Log& Log::operator<<( const std::wstring& input )
{ printf("wstring ref"); }
template <> Log& Log::operator<<( const wchar_t* input )
{ printf("wchar_t ptr"); }
template <> Log& Log::operator<<( const TCHAR*& input )
{ printf("tchar ptr ref"); }
Теперь я использую следующую тестовую программу для проверки этих функций.
// main.cpp - test program
int main()
{
Log log;
log << "test 1";
log << L"test 2";
std::string test3( "test3" );
log << test3;
std::wstring test4( L"test4" );
log << test4;
TCHAR* test5 = L"test5";
log << test5;
}
Выполнение вышеуказанных тестов показывает следующее:
// Test results
ptr
wchar_t ptr
ref
wstring ref
ref
К сожалению, это не совсем так. Я бы очень хотел, чтобы последний был "TCHAR", чтобы я мог его преобразовать. Согласно отладчику Visual Studio, когда я перехожу к функции, вызываемой в тесте 5, типом является wchar_t * &, но он не вызывает соответствующую специализацию. Идеи?
Я не уверен, уместно это или нет, но это на устройстве Windows CE 5.0.