我想简化代码以对 ANSI 和 UNICODE 字符串版本使用相同的函数
tstring formatW(const std::string format, ...);
tstring formatA(const std::wstring format, ...);
Run Code Online (Sandbox Code Playgroud)
在单个参数化函数中
tstring format(const tstring format, ...);
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用它,我会在第 3 行收到错误
const std::string fmtA = "MouseWheel nFlags %u,zDelta %d, CPoint(%d,%d";
std::string strA = formatA(fmtA, nFlags, zDelta, pt.x, pt.y ); // Ok
std::string strA2 = format (fmtA, nFlags, zDelta, pt.x, pt.y ); // Fail :(
const std::wstring fmtW = L"MouseWheel nFlags %u,zDelta %d, CPoint(%d,%d";
std::wstring strW = formatW(fmtW, nFlags, zDelta, pt.x, pt.y); // Ok
std::wstring strW2 = format (fmtW, nFlags, zDelta, pt.x, pt.y); // Fail
Run Code Online (Sandbox Code Playgroud)
我得到的错误是这样的:
错误 C2664: ~tstring Format(const tstring,..'.)': 无法将参数 1 从 'const std::string' 转换为 'const tstring'
我对参数化函数不熟悉。
char和wchar_t(string/wstring 的底层类型)不兼容(8 位和 16 位),因此您无法在运行时检查环境中组合它们。
这就是为什么 Windows 对于许多功能有 2 个版本(MessageBoxA、MessageBoxW 等)。
解决方案:使用一个将数据存储为 UTF-8(char)的类,然后在需要 wchar_t 时将其转换为 16 位。或者更好,反之亦然(内部使用 wchar_t 并在需要 char* 时将数据转换为 UTF-8)。