Почему не делают станд.:: классы fstream берут станд.:: строка?

Просто добавьте еще один, более базовый подход:

st = ""
for char in u:
    st = "{0}{1}{2}".format( st, char, l[ u.index( char ) ] )
34
задан Brian R. Bondy 2 November 2008 в 03:16
поделиться

8 ответов

Путем взятия струны до C++ 03 std::fstream класс уменьшил зависимость от std::string класс. В C++ 11, однако, std::fstream класс действительно позволяет передавать std::string для его параметра конструктора.

Теперь, можно ли задаться вопросом, почему не там прозрачное преобразование из std:string к струне до, таким образом, класс, который ожидает струну до, мог все еще взять std::string точно так же, как класс, который ожидает std::string, может взять струну до.

причина состоит в том, что это вызвало бы цикл преобразования, который в свою очередь может привести к проблемам. Например, предположите std::string, было бы конвертируемо к струне до так, чтобы Вы могли использовать std::string с с [1 110] с. Предположим также, что струна до конвертируема к [1 111] с, как состояние в текущем стандарте. Теперь, рассмотрите следующее:

void f(std::string str1, std::string str2);
void f(char* cstr1, char* cstr2);

void g()
{
    char* cstr = "abc";
    std::string str = "def";
    f(cstr, str);  // ERROR:  ambiguous
}

, поскольку можно преобразовать так или иначе между std::string и струна до, которую вызов к [1 113] мог разрешить к любому из два f() альтернативы, и таким образом неоднозначно. Решение состоит в том, чтобы повредить цикл преобразования путем создания одного направления преобразования явным, который является тем, что STL принял решение сделать с [1 115].

26
ответ дан wilhelmtell 11 October 2019 в 06:42
поделиться

Существует несколько мест, где комитет по стандарту C++ действительно не оптимизировал взаимодействие между средствами в стандартной библиотеке.

std::string и его использование в библиотеке один из них.

Еще один пример std::swap. Много контейнеров имеют функцию членства подкачки, но никакую перегрузку станд.:: подкачка предоставляется. То же идет для std::sort.

я надеюсь, что все эти мелочи будут зафиксированы в предстоящем стандарте.

14
ответ дан Christopher 11 October 2019 в 06:42
поделиться

Возможно, это - утешение: весь fstream's получил открытое (строковая константа &...) рядом с открытым (символьная константа *...) в рабочем проекте C++ 0x стандарт. (см., например, 27.8.1.6 для basic_ifstream объявления)

Поэтому, когда оно завершено и реализовало, это не будет больше получать Вас:)

11
ответ дан Pieter 11 October 2019 в 06:42
поделиться

Потоковая библиотека IO была добавлена к стандартной библиотеке C++ перед STL. Для не повреждения обратной совместимости было решено постараться не изменять библиотеку IO, когда STL был добавлен, даже если это означало некоторые проблемы как та, которую Вы повышаете.

9
ответ дан Drealmer 11 October 2019 в 06:42
поделиться

Bernard:
"Непредставленные в виде строки" Монолиты. "Все для одного, и один для всех" могут работать на Мушкетеров, но это не работает почти также на разработчиков класса. Вот пример, который является не в целом образцовым, и он иллюстрирует, как плохо можно пойти не так, как надо, когда дизайн превращается в сверхдизайн. Пример, к сожалению, взят из стандартной библиотеки около Вас... ~ http://www.gotw.ca/gotw/084.htm

3
ответ дан swmc 11 October 2019 в 06:42
поделиться

Это несущественно, который верен. Что делает Вы подразумеваете под станд.:: интерфейс строки, являющийся большим? Что делает большой средний в этом контексте - много вызовов метода? Я не остроумен, мне на самом деле интересно.

Это имеет больше методов, чем этому действительно нужно, и его поведение использования интегральных смещений, а не итераторов немного сомнительно (поскольку это противоречит пути остальная часть работ библиотеки).

реальная проблема, я думаю, - то, что библиотека C++ имеет три части; это имеет старую библиотеку C, это имеет STL, и это имеет strings-iostreams. Хотя некоторые усилия были приложены для образования моста различных частей (например, добавление перегрузок к библиотеке C, потому что перегрузка поддержек C++; добавление итераторов к basic_string; добавление iostream адаптеров итератора), существует много несоответствий при рассмотрении детали.

, Например, basic_string включает методы, которые являются ненужными дубликатами стандартных алгоритмов; различные методы находки, мог, вероятно, быть безопасно удален. Другой пример: локали используют необработанные указатели вместо итераторов.

2
ответ дан DrPizza 11 October 2019 в 06:42
поделиться

Есть ли любой класс в STL, который берет строку... Я не думаю так (не мог найти никого в моем быстром поиске). Таким образом, это - вероятно, некоторое проектное решение, что никакой класс в STL не должен зависеть ни от какого другого класса STL (который не непосредственно необходим для функциональности).

0
ответ дан Magnus Westin 11 October 2019 в 06:42
поделиться

Я полагаю, что об этом думали и сделали для предотвращения зависимости; т.е. #include < fstream> не должен вызывать тот к #include < string>.

Честно говоря, это походит вполне на несущественную проблему. Лучший вопрос был бы, почему станд.:: интерфейс строки, настолько большой?

0
ответ дан DrPizza 11 October 2019 в 06:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: