我有這樣的功能:如何將通用文件流作爲參數傳遞?
void check_open (ifstream& file)
{
if (not file.is_open())
{
cout << "Error." << endl;
exit(1);
}
}
但我只能通過ifstream的論點,我怎麼能使其也接受ofstream的論點?
我有這樣的功能:如何將通用文件流作爲參數傳遞?
void check_open (ifstream& file)
{
if (not file.is_open())
{
cout << "Error." << endl;
exit(1);
}
}
但我只能通過ifstream的論點,我怎麼能使其也接受ofstream的論點?
只要流具有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'等)並將基類類型轉換爲適當的派生類類型,然後可以調用所需的方法。 – 2013-11-24 08:01:56
嘗試一個令人興奮的涉獵到模板領土:
template<typename F>
void check_open (F& file)
{
if (not file.is_open())
{
cout << "Error." << endl;
exit(1);
}
}
嗯,多餘的,抱歉。 – RichardPlunkett
這個功能真的似乎沒有做太多,因爲它需要IS_OPEN退出。您可以放棄該函數,並在調用代碼assert(file.is_open())中使用斷言。 但是,如果你的敏銳,你可以使這個模板的功能,tehn它會適用於任何類型定義is_open – RichardPlunkett