2013-11-24 25 views
1

我有這樣的功能:如何將通用文件流作爲參數傳遞?

void check_open (ifstream& file) 
{ 
    if (not file.is_open()) 
    { 
     cout << "Error." << endl; 
     exit(1); 
    } 
} 

但我只能通過ifstream的論點,我怎麼能使其也接受ofstream的論點?

+0

這個功能真的似乎沒有做太多,因爲它需要IS_OPEN退出。您可以放棄該函數,並在調用代碼assert(file.is_open())中使用斷言。 但是,如果你的敏銳,你可以使這個模板的功能,tehn它會適用於任何類型定義is_open – RichardPlunkett

回答

3

只要流具有is_open()方法,所述功能如下工作得很好(fstreamifstreamofstream,以及它們的不同字符類型的變體)。

template<typename stream_type> 
void check_open (const stream_type& file) 
{ 
    if (not file.is_open()) 
    { 
     cout << "Error." << endl; 
     exit(1); 
    } 
} 
+1

謝謝,我從來沒有使用模板,現在我知道它們有多有用 –

-1

只傳遞函數中的文件名,並在函數內部使用ifstreamofstream

+0

但函數如何知道調用者想要一個輸入或輸出流? –

+0

@JoachimPileborg你的問題應該是OP,我只是幫助實現他想要的東西:) – theharshest

+0

OP想要的是檢查一個*流*是否打開,如果不是,則退出該程序。傳遞文件名不會有幫助。 – john

1

接受(引用一個)這些類的公共基類應該有所訣竅。

void check_open (std::ios &file) 
{ 
    // ... 
} 
+1

但是'is_open'既不存在於'std :: ios'也不在'std :: basic_ios ' – P0W

+0

@ P0W但是由於它**是在其中一個子類中定義的,所以可以使用多態性('dynamic_cast'等)並將基類類型轉換爲適當的派生類類型,然後可以調用所需的方法。 – 2013-11-24 08:01:56

0

嘗試一個令人興奮的涉獵到模板領土:

template<typename F> 
void check_open (F& file) 
{ 
    if (not file.is_open()) 
    { 
     cout << "Error." << endl; 
     exit(1); 
    } 
} 
+0

嗯,多餘的,抱歉。 – RichardPlunkett

相關問題