我们有一堆不支持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&);

09-07 00:14