[C++] std :: ifstream 클래스의 디자인


Answers

내 표준 사본이 당신과 동의하지 않습니다. 두 가지 모두 과부하라고 말합니다.

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>#include <string> 해야하고 다른 라이브러리는 사용하지 않으려는 다른 모든 수하물을 필요로하지 않기 때문입니다.

Question

STL의 아름다움을 본 우리는 원시 포인터배열 을 사용하여 어디에서나 사용하도록 권장 합니다 . Scott MeyersEffective STL 이라는 제목으로 STL에 대한 전체 서적을 저술했습니다. 그러나 ifstream 개발자는 std::string 보다 char* 를 선호했다. ifstream::open() 의 첫 번째 매개 변수가 const std::string & 대신 const char* 유형인지 궁금 const std::string & . 그것의 서명을보십시오 :

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

왜? 왜 안돼 :

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

디자인과 관련하여 심각한 실수입니까? 아니면이 디자인은 고의적입니까? 그 이유는 무엇일까요? std::string 보다 char* 를 선호하는 이유가 없습니다. std::string 을 취하는 후자의 함수에 char* 를 전달할 수 있습니다. 그건 문제가되지 않습니다!

그건 그렇고, ifstream 은 typedef라는 것을 알고 있습니다. 그래서 내 제목에 대한 코멘트가 없습니다. 짧아서 내가 그것을 사용하는 이유입니다.

실제 클래스 템플릿은 다음과 같습니다.

template<class _Elem,class _Traits> class basic_ifstream;



일반적으로 C 문자열에서 std::string 을 생성하는 것보다 std::string string에서 C 문자열을 얻는 것이 더 이상 비용이 들지 않습니다. C 문자열에서 std::ifstream 을 사용하려는 경우 둘 다, 인터페이스에서 const char* 를 사용하는 것은 상당한 비용이 들지 않습니다.

디자인과 관련하여 심각한 실수입니까?

현재 인터페이스로는 무엇을 할 수 없습니까? const std::string& 인터페이스를 사용하면 어떤 구체적인 이점이 있습니까?

std::string 오버로드의 실제 이점은 처음에는 std :: string과 streams을 함께 사용하려고 시도 할 때 쉽게 이해할 수있는 초보자에게 도움이되는 것입니다. 숙련 된 C ++ 개발자에게는 필요한 경우 .c_str() 을 작성하는 데 드는 사소한 비용이 개발 코드에 포함되는 나머지 노력에 비해 무시할 수있을 것입니다.




IOStream은 STL의 일부가 표준 라이브러리에 통합되기 전에 설계 되었기 때문에. 그 후 문자열 클래스가 만들어졌습니다. 표준화 과정에서 꽤 늦었고 IOStream을 수정하는 것이 저장으로 간주되지 않았습니다.

BTW는 C ++ 0X의 사소하지만 편리한 변경의 일환으로 이런 종류의 정리 작업이있었습니다.