【发布时间】:2015-07-08 11:13:36
【问题描述】:
除了从参数 facet 安装的 Facet 类型的 facet(通常从参数的类型推断)之外,构造 other 的副本。如果 facet 为 NULL,则构造的语言环境是 other 的完整副本。以这种方式构建的语言环境没有名称。
我尝试使用我的Facethere 构建,但是当我在do_decimal_point 和do_thousands_sep 中设置断点时,它们永远不会被调用:(
我可以看到 Facet 被传入,但它被传递到标准库实现文件中,所以我看不到它是否做过任何事情。
我已经在 Visual Studio 2013、Clang 3.6.0 和 gcc 4.9.2 上进行了尝试。 所有他们的行为就好像我从来没有通过 Facet 只是使用另一个 locale 的行为。
我在任何编译器中都找不到针对此构造函数的任何错误。我认为我这样做是正确的。为什么我不能让locale 使用我的Facet 构造?
编辑:
the request of 0x499602D2 我添加了一个示例。有趣的是,Facet does 似乎被选中,但 not 与 get_money 一起使用。我正在链接live example of this(它必须使用locale("C") 而不是locale("en-US")):
class Foo : public std::moneypunct<char> {
protected:
char_type do_decimal_point() const {
cout << "Hit Foo::do_decimal_point";
return ',';
}
char_type do_thousands_sep() const {
cout << "Hit Foo::do_thousands_sep";
return '.';
}
};
int main()
{
cout.imbue(locale(locale("en-US"), new Foo));
const moneypunct<char>* temp = &use_facet<std::moneypunct<char>>(cout.getloc());
cout << temp->decimal_point() << endl << temp->thousands_sep() << endl;
istringstream USCurrency("1,234.56 -1,234.56 1.234,56 -1.234,56");
USCurrency.imbue(cout.getloc());
long double value;
USCurrency >> get_money(value, true);
return 0;
}
这个输出:
点击 Foo::do_thousands_sepHit Foo::do_decimal_point,
.
我希望它输出:
点击 Foo::do_thousands_sepHit Foo::do_decimal_point,
.
点击 Foo::do_thousands_sepHit Foo::do_decimal_point
EDIT2:
似乎moneypunct<char> 不能被继承,因为它没有正确构造,除非它是由locale 在内部构造的。这至少在 Visual Studio 上是个问题,因为它通过grouping 确定是否使用thousands_sep。解决方法可能是完全重新实现moneypunct<char> 的功能。我现在正在修补它。同时我也在这里添加了一个错误:https://connect.microsoft.com/VisualStudio/feedback/details/1524749/inheriting-from-moneypunct-requires-use-of-unavailable-construction-information
【问题讨论】:
-
能否请您提供一个 mcve?
-
@0x499602D2 我添加了一个示例,令我惊讶的是,它使这个问题无效......我需要对
get_money的工作原理进行更多研究。 -
我得到了预期的输出here。
-
@0x499602D2 令人着迷。然而,当我查看
value时只包含: 1. 所以即使 gcc 5.1.0 支持locale的Facet构造函数get_money仍然不起作用。所以也许这应该写成针对 Visual Studio 2013 和 Clang 3.6.0 的错误。应该针对 gcc 5.1.0 编写一些其他错误。我想我应该继续这样做。
标签: c++ inheritance locale standards facets