나는이 기능이 있습니다일반 파일 스트림을 매개 변수로 전달하는 방법은 무엇입니까?
void check_open (ifstream& file)
{
if (not file.is_open())
{
cout << "Error." << endl;
exit(1);
}
}
을하지만 난 단지, 내가 어떻게이 인수를 ofstream도 받아 들일 수 ifstream 인수를 전달할 수 있습니다?
나는이 기능이 있습니다일반 파일 스트림을 매개 변수로 전달하는 방법은 무엇입니까?
void check_open (ifstream& file)
{
if (not file.is_open())
{
cout << "Error." << endl;
exit(1);
}
}
을하지만 난 단지, 내가 어떻게이 인수를 ofstream도 받아 들일 수 ifstream 인수를 전달할 수 있습니다?
만큼 스트림이 is_open()
방법이 있기 때문에,이 함수는 아래 잘 작동 (fstream
, ifstream
, ofstream
및 다른 문자 유형과 이들의 변종).
template<typename stream_type>
void check_open (const stream_type& file)
{
if (not file.is_open())
{
cout << "Error." << endl;
exit(1);
}
}
덕분에 템플릿을 사용하지 않았지만 지금은 얼마나 유용한 지 알 수 있습니다. –
함수에서 파일 이름 만 전달하고 함수 내에 ifstream
또는 ofstream
을 사용하십시오.
그러나 호출자가 입력 또는 출력 스트림을 원한다면 함수가 어떻게 알 수 있습니까? –
@ JoachimPileborg 귀하의 질문은 OP로해야합니다, 나는 그가 원하는 것을 이루기 위해 최선을 다하고 있습니다. – theharshest
OP가 원하는 것은 * 스트림 *이 열려 있는지 확인하고 그렇지 않은 경우 프로그램을 종료하는 것입니다. 파일 이름을 전달하는 것은 아무런 도움이되지 않습니다. – john
해당 클래스의 공통 기본 클래스를 수락하면 트릭을 수행해야합니다.
void check_open (std::ios &file)
{
// ...
}
'is_open '은'std :: ios'에도 없으며 'std :: basic_ios
@ P0W 그러나 ** 그것은 하위 클래스 중 하나에서 정의되었으므로 다형성 ('dynamic_cast' 등)을 사용하고 기본 클래스 유형을 적절한 파생 클래스 유형으로 변환 할 수 있습니다. 그런 다음 필요한 메소드를 호출 할 수 있습니다. –
은 템플릿 영역으로 흥미 진진한 손 대고 시도 :이 종료 할 IS_OPEN 필요로하기 때문에
이 기능은 정말 나던template<typename F>
void check_open (F& file)
{
if (not file.is_open())
{
cout << "Error." << endl;
exit(1);
}
}
흠, 중복, 죄송합니다. – RichardPlunkett
은 많이 할 것 같다. 함수를 버리고 호출 코드 assert (file.is_open())에서 어설 션을 사용할 수 있습니다. 예를 들어,이 함수를 템플릿 함수로 만들 수 있다면 is_open을 정의한 모든 유형에서 작동합니다. – RichardPlunkett