VC6 - 如何使用用户定义的分面创建 std::locale

VC6 - How to create a std::locale with a user defined facet?

本文关键字:创建 std locale 何使用 用户 定义 VC6      更新时间:2023-10-16

我尝试使用以下代码行创建一个语言环境:

std::locale loc(std::locale::classic(), new comma);

comma的定义是:

struct comma : std::numpunct<char> {
    char do_decimal_point() const { return ','; }
};

我认为它应该可以工作,因为我在 MSDN 文档中看到了类似的构造函数调用。不幸的是,我收到错误:

错误 C2664:"__thiscall std::locale::std::locale(const char *,int(":无法从"const char *"中的"const class std::locale"转换参数编号 1

你知道,我怎样才能把它做好吗?

在Stackoverflow上有一些答案,它们以这种方式(这个或这个(做对了。但似乎旧的 VC6 编译器不支持此构造函数(尽管 VC6 文档中的示例使用它(。但是必须有一种方法可以在VC6中使用分面,否则它不会成为文档的一部分。

要使用用户定义的分面创建 std::locale,我们可以使用 _ADDFAC .在locale构造函数的文档中,我发现了这个有用的提示:

[...]你应该写_ADDFAC(loc, Facet)来返回一个新的locale,将分面Facet添加到语言环境loc,因为并非所有转换器目前都支持额外的模板构造函数

VC6 似乎不支持其他模板构造函数。

示例代码:

std::istringstream iss("333,444"); // comma is decimal mark
std::locale loc(std::_ADDFAC(iss.getloc(), new comma));
iss.imbue(loc);
iss >> e;
std::cout << e << std::endl; // prints 333.444