我正在编写一个使用模板化 operator<< 函数的日志记录类。我将模板函数专门用于宽字符串,以便在编写日志消息之前进行一些从宽到窄的翻译。我无法让 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 设备上。