Я хочу реализовать библиотеку c ++, и, как и многим другим библиотекам, мне нужно принимать строковые аргументы от пользователя и возвращать строки.Текущий стандарт определяет std :: string и std :: wstring (я предпочитаю wstring).Теоретически я должен реализовать методы со строковыми аргументами дважды:
virtual void foo(std::string &) = 0; // convert internally from a previous defined charset to unicode
virtual void foo(std::wstring &) = 0;
C ++ 0x не облегчает жизнь, для char16_t и char32_t мне нужно:
virtual void foo(std::u16string &) = 0;
virtual void foo(std::u32string &) = 0;
Обрабатывать такие разныеВнутренние типы - например, помещение всех в закрытый векторный член - требуют преобразования, обертки ... это ужасно.
Другая проблема заключается в том, хочет ли пользователь (или я) работать с пользовательскими распределителями или настроенными классами свойств:все, что приводит к совершенно новому типу.Например, для написания пользовательских специализаций codecvt для многобайтовых кодировок, стандарт говорит, что я должен ввести пользовательский тип state_type, для которого требуется специальный класс свойств, который приводит к новому типу std :: basic_ifstream <>, и это полностью несовместимо с интерфейсами, ожидающими std.:: ifstream & в качестве аргумента.
Одним из решений -possible- является создание каждого библиотечного класса в качестве шаблона, который управляет типом-значением, признаками и распределителями, указанными пользователем.Но это излишне и делает абстрактные базовые классы (интерфейсы) невозможными.
Другое решение - просто указать один тип (например, u32string) по умолчанию, каждый пользователь должен передавать данные с использованием этого типа.Но теперь подумайте о проекте, который использует 3 библиотеки, а первая библиотека использует u32string, вторую библиотеку u16string и третью библиотеку wstring -> HELL.
Что я действительно хочу, так это объявить метод как void foo (put_unicode_string_here) - без представления моего собственного класса UnicodeString или UnicodeStream.