locale
Facet
constructor:локаль Аспект Конструктор игнорируемого
конструктов копия других для фасета типа Facet (как правило, выведенного из типа аргумента), который установлен с аргументом фаски исключения. Если грань NULL, построенный языковой стандарт является полной копией другого. Таким образом, локаль, построенная таким образом, не имеет имени.
Я пытаюсь построить с помощью моего Facet
here, но когда я ставлю брейк-пойнт в моей 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
делает, кажется, подобрано, но не использовано с 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;
}
Это выходы:
Hit Foo :: do_thousands_sepHit Foo :: do_decimal_point,
.
Я бы ожидать, что это выход:
Hit Foo :: do_thousands_sepHit Foo :: do_decimal_point,
.
Hit Foo :: do_thousands_sepHit Foo :: do_decimal_point
EDIT2:
Оказывается, что moneypunct<char>
не может быть унаследован от, как он не получает построен правильно, если она не будет построена внутренне locale
. Что по крайней мере на Visual Studio является проблемой, потому что она определяет, следует ли использовать thousands_sep
grouping
. Работа может заключаться в полной переоценке функциональности moneypunct<char>
. Теперь я занимаюсь этим.В то же время я также добавил, ошибка здесь: https://connect.microsoft.com/VisualStudio/feedback/details/1524749/inheriting-from-moneypunct-requires-use-of-unavailable-construction-information
Не могли бы вы предоставить нам mcve? – 0x499602D2
@ 0x499602D2 Я добавил пример, который, к моему удивлению, аннулирует этот вопрос ... Мне нужно сделать больше исследований о том, как работает 'get_money'. –
Я получаю ожидаемый результат [здесь] (http://coliru.stacked-crooked.com/a/2f0c461fda32a17c). – 0x499602D2