2011-01-09 5 views
5

Те из нас, кто видел красоту STL пытаются использовать его как можно больше, а также поощрять других, чтобы использовать его там, где мы видим их, используя сырые указатели и массивы. Scott Meyers написали целую книгу по STL, с заголовком Effective STL. Но что случилось с разработчиками ifstream, что они предпочли char* по сравнению с std::string. Интересно, почему первый параметр ifstream::open() имеет тип const char*, а не const std::string &. Посмотрите, что это подпись:Дизайн станд :: ifstream класса

void open(const char * filename, ios_base::openmode mode = ios_base::in); 

Почему это? Почему бы и нет:

void open(const string & filename, ios_base::openmode mode = ios_base::in); 

Это серьезная ошибка с дизайном? Или этот дизайн преднамерен? Что может быть причиной? Я не вижу причин, по которым они предпочли char* за std::string. Обратите внимание, что мы все равно можем передать char* последней функции, которая принимает std::string. Это не проблема!

Кстати, я знаю, что ifstream - это typedef, поэтому никаких комментариев по моему заголовку.: P. Это выглядит коротко, поэтому я использовал его.

Шаблон фактический класс:

template<class _Elem,class _Traits> class basic_ifstream; 
+0

Единственные потоки, связанные с STL, состоят в том, что оба являются частью std lib. __Стандартная библиотека! = STL .__ – sbi

ответ

4

My copy of the standard не согласен с вами. Он говорит, как это перегружает:

void open(const char* s, ios_base::openmode mode = ios_base::in); 
void open(const string& s, ios_base::openmode mode = ios_base::in); 

Однако эта копия стандарта является проект следующей версии стандарта, C++ 0x.

Причина этого заключается в том, что iostreams библиотеки предшествует std::basic_string, а потому разработчики библиотеки не хотят кого-то придется #include <string> и все это другой связанным с багажом, если они не хотят, чтобы использовать его.

+3

Возможно, вы смотрите на проект C++ 0X. – AProgrammer

+0

@ Программист: Хм .. не знал, что это изменилось. Добавлена ​​ссылка на копию, которую я использую, чтобы сделать это более понятным. –

+2

@Billy ONeal: это не C++ 03. Я говорю о C++ 03. – Nawaz

7

Поскольку IOStream был разработан путь, прежде чем часть СТЛ была интегрирована в стандартной библиотеке. После этого был создан класс string. Это было довольно поздно в процессе стандартизации, и изменение IOStream не считалось сохранением.

BTW, как часть незначительных, но удобных изменений в C++ 0X, была чистка такого рода вещей.

0

Ни обычно не дороже, чтобы получить строку C от std::string, чем это построить std::string из строки C так, учитывая, что вы, вероятно, хотите использовать std::ifstream с именами файлов, которые приходят от обоих, используя const char* в интерфейсе не значительная стоимость.

Это серьезная ошибка с дизайном?

Что вы не можете сделать с текущим интерфейсом? Какая конкретная и значительная польза принесет const std::string& в интерфейсе?

Настоящая выгода от перегрузки std::string, как я вижу, - это помощь начинающим, позволяющая легко справляться с попытками использовать std :: string и streams вместе. Для опытных разработчиков C++ тривиальная стоимость записи .c_str(), когда это необходимо, может быть незначительной по сравнению с остальными усилиями, которые идут на разработку кода.

+0

@Charles Bailey: это похоже на постфактумную рационализацию. : P – Nawaz

+0

@Nawaz: Что вы просите, если не рационализации после факта (учитывая, что текущий интерфейс уже стандартизован)? –

+0

@Charles Bailey: Я имею в виду, если бы они предпочли 'std :: string' над' char * ', вы бы сказали то же самое. Просто в обратном порядке. И это все равно выглядит обоснованным.: | ... в то время как мой вопрос касался того, почему они сами не использовали std :: string, если в этом нет вреда. – Nawaz

Смежные вопросы