Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以使用C++;模板来生成函数的Unicode/ANSI变体,而不是使用预处理器?_C++_Windows_Templates - Fatal编程技术网

C++ 我可以使用C++;模板来生成函数的Unicode/ANSI变体,而不是使用预处理器?

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

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