我们有一堆不支持Unicode的旧代码,因此我们在代码中使用的过渡模式是将函数移至.inl
文件,将char
更改为CHAR_TYPE
,然后包装它像这样:
#define CHAR_TYPE wchar_t
#define STRING_TYPE std::wstring
#define MyFunctionName MyFunctionNameW
#include "MyFunction.inl"
#undef CHAR_TYPE
#define CHAR_TYPE char
#undef STRING_TYPE
#define STRING_TYPE std::string
#undef MyFunctionName
#define MyFunctionName MyFunctionNameA
#include "MyFunction.inl"
...其中
MyFunction.inl
然后定义MyFunctionName
,使用宏生成“ A”版本和“ W”版本。这很麻烦,但是很遗憾,在我们将所有代码转换为支持Unicode之前,这是必需的。
有没有其他方法可以使用模板执行此操作?我认为类似以下的内容会很好:
typedef MyFunctionName<wchar_t, std::wstring> MyFunctionNameW
typedef MyFunctionName<char, std::string> MyFunctionNameA
这可能吗?
最佳答案
Roger Pate对界面完全正确。您不必理会A和W后缀。但是,这仍然存在实施问题。如您所料,模板是正确的解决方案。而且由于不需要其他名称,因此可以省略typedef。你只会有template <typename TSTRING> void MyFunctionName (TSTRING const&);