C++ 我可以使用C++;模板来生成函数的Unicode/ANSI变体,而不是使用预处理器?
我们有一堆不支持Unicode的遗留代码,因此我们在代码中使用的一种过渡模式是将函数移动到C++ 我可以使用C++;模板来生成函数的Unicode/ANSI变体,而不是使用预处理器?,c++,windows,templates,C++,Windows,Templates,我们有一堆不支持Unicode的遗留代码,因此我们在代码中使用的一种过渡模式是将函数移动到.inl文件中,将char更改为char\u TYPE,然后将其打包如下: #define CHAR_TYPE wchar_t #define STRING_TYPE std::wstring #define MyFunctionName MyFunctionNameW #include "MyFunction.inl" #undef CHAR_TYPE #define CHAR_TYPE char #u
.inl
文件中,将char
更改为char\u 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
typedef MyFunctionName MyFunctionNameW
类型定义MyFunctionName MyFunctionNameA
这可能吗?更新:我误解了这个问题,认为您已经编写了A和W函数,您希望通过相同的名称调用它们。您所遇到的情况确实是模板设计的情况,但我不会重复正确的答案
简单的重载工作,不需要模板或额外的复杂性。Win32 API使用宏,因为C没有重载
inline
void MyFunctionName(std::wstring const& value) { MyFunctionNameW(value); }
inline
void MyFunctionName(std::string const& value) { MyFUnctionNameA(value); }
是的,这是可能的,这基本上就是std::string和std::wstring所做的,因为它们实际上是
std::basic_string
的typedef,罗杰·佩特对接口的看法完全正确。你不应该为A和W后缀而烦恼。然而,这仍然存在执行问题。正如您所料,模板是正确的解决方案。由于不需要不同的名称,因此可以省略typedef。你会的
模板void MyFunctionName(TSTRING const&)代码>Windows已经提供了这样的宏。你说的是非Win32 API吗?我说的是代码中实现的函数。我们需要将它们转换成Unicode,零碎的。在什么样的并行世界中,std::string
变成了一个函数?;)std::string
有许多成员函数,它们看起来是“widechar中立的”。如果原始函数签名类似于char MyFunctionName(int x,float y),那么这一点都没有帮助;如果函数只在返回类型上不同,模板也不会有帮助。我相信这里的要点是避免重复MyFunctionName
的主体。这里唯一的问题是我认为它应该是typename TCHAR
而不是typename TSTRING
。