Каждый раз, когда я преподаю ООП в C++ или Java, я обычно получаю следующее:
// My class!
Class myclass
{
//Default constructor
public myClass()
{
...
}
}
Моя политика состоит в том, чтобы объявить студентам, что они потеряли бы точки и для недостаточной и для лишней документации
operator () std :: locale - это именно то, что вы ищете. Чтобы получить текущий глобальный языковой стандарт, просто используйте конструктор по умолчанию.
После небольшого поиска я понял, что одним из способов сделать это может быть перегрузка шаблона std :: basic_string
для создания нового локализованного строкового класса.
В этом, вероятно, есть множество ошибок, но в качестве доказательства концепции:
#include <iostream>
#include <locale>
#include <string>
struct localed_traits: public std::char_traits<wchar_t>
{
static bool lt(wchar_t a, wchar_t b)
{
const std::collate<wchar_t>& coll =
std::use_facet< std::collate<wchar_t> >(std::locale());
return coll.compare(&a, &a+1, &b, &b+1) < 0;
}
static int compare(const wchar_t* a, const wchar_t* b, size_t n)
{
const std::collate<wchar_t>& coll =
std::use_facet< std::collate<wchar_t> >(std::locale());
return coll.compare(a, a+n, b, b+n);
}
};
typedef std::basic_string<wchar_t, localed_traits> localed_string;
int main()
{
localed_string s1 = L"z", s2 = L"å", s3 = L"ä", s4 = L"ö";
std::cout << (s1 < s2 && s2 < s3 && s3 < s4 ) << "\n"; //Outputs 0
std::locale::global(std::locale("sv_SE.UTF-8"));
std::cout << (s1 < s2 && s2 < s3 && s3 < s4 ) << "\n"; //Outputs 1
return 0;
}
Howerver, похоже, это не сработает, если вы основываете его на char
вместо wchar_t
и я понятия не имею, почему ...
В C ++ вам нужно использовать стандартный фасет collate . Посмотрите .