2012-02-21 62 views
5

我想將具有保存發送到它的數據的函數的類設置爲文本文件。可以傳遞給它的數據可以像一個std::stringintdoublefloatunsigned int等任何東西,也可以是:std::vector<T>T[]std::vector<std::vector<T>>T[][]用於數組,向量,內置類型的C++模板函數STL

現在,顯然如果它是一個數組,我需要遍歷它才能將數據發送到文本文件。我想使用模板,但我不知道如何做數組。

這是要走的路嗎?

class CMyClass 
{ 
    template<typename T> 
    void SaveData(T data); 
    void SaveData(std::vector<T> data); 
    void SaveData(std::string data); 
    void SaveData(T* data);    // Perhaps I'll also need to pass in the size. 
    void SaveData(std::vector<std::vector<T>> data); 
    void SaveData(T** data); 
}; 

我想象的std::string代碼是相同的代碼,std::vector<T>提供T是類型內置(像intfloat或東西)。

然後我相應地編寫SaveData(...)的每個函數?

+0

您的標題非常寬泛和模糊,您可能想要重新修飾它。 – 2012-02-21 06:55:19

+4

供參考:http://www.boost.org/doc/libs/1_48_0/libs/serialization/doc/index.html – Anycorn 2012-02-21 06:55:52

回答

5

首先,你可以在模板類或函數。既然你想要做陣列,你必須去後者的選項。舉例如下:

class CMyClass 
{ 
public: 
    template<typename T> void SaveData(const T &data); 
    template<typename T, size_t N> void SaveData(const T (&data)[N]); 
    template<typename T, size_t N, size_t M> void SaveData(const T (&data)[N][M]); 
    template<typename T> void SaveData(const std::vector<T> &data); 
    template<typename T> void SaveData(const std::vector<std::vector<T> > &data); 
    void SaveData(const std::string &data); 
}; 

一旦你定義的功能,下面的例子說明如何稱呼他們:

int i; 
int i1[5]; 
int i2[5][7]; 
std::vector<int> v1; 
std::vector<std::vector<int> > v2; 
std::string s; 

CMyClass saveClass; 

saveClass.SaveData<int>(i); 
saveClass.SaveData<int>(i1); 
saveClass.SaveData<int>(i2); 
saveClass.SaveData<int>(v1); 
saveClass.SaveData<int>(v2); 
saveClass.SaveData(s); 

根據您的要求,您可以使類單和功能靜,省略了需要在所有實例CMyClass和簡單地調用功能如下:

CMyClass::SaveData<int>(i); 
CMyClass::SaveData<int>(i1); 
CMyClass::SaveData<int>(i2); 
CMyClass::SaveData<int>(v1); 
CMyClass::SaveData<int>(v2); 
CMyClass::SaveData(s); 

注:

  1. 參數也應該是引用(即, 「&數據」而不是「數據」),因此每次調用函數時只傳遞引用而不是執行整個容器的副本。
  2. 我已經明確聲明函數爲public,假設這是完整的類,它的函數將被另一個類訪問。默認情況下,一個類的成員是私人的。
  3. 確保每個嵌套的「>」之間有空格。

祝你好運!

+0

謝謝你做得太多!這真的有幫助。我有一個問題,爲什麼你用數組而不是數據?它只是一個命名的東西,或者它是否做了一些事情,因爲我只是在VS中看到它做了一些事情。 – 2012-02-21 13:10:17

+0

我使用「數組」作爲變量名稱只是習慣的一種力量。我編輯了代碼,以便它現在是「數據」來維護接口一致性。別擔心,「數組」不是C++中的關鍵字。對不起,可能造成的任何混淆! – athwaites 2012-02-21 14:12:14

+0

謝謝最後一個問題,爲了實現std :: vector >,我不得不再次進行單獨的重載,我不會,儘管事實上該方法可能與std ::矢量>? – 2012-02-21 21:59:19

0

我相信你在一個類中混合了兩件事情,應該避免這樣做:據我所知,你的類是關於什麼(它的「責任」)是將數據寫入文件。你添加的另一件事是關於迭代數據集合的知識。

看看STL的<algorithm>方法:

http://www.cplusplus.com/reference/algorithm/

那裏你可以找到迭代數據,例如通用方式在find方法:

template<class InputIterator, class T> 
    InputIterator find (InputIterator first, InputIterator last, const T& value) 
    { 
    for (;first!=last; first++) if (*first==value) break; 
    return first; 
    } 

這使你從您是否使用vectorlist,數組或任何獨立。

如果您還想序列化諸如vector<vector<T> >(請注意兩個>!之間的空格!),您必須更多地解釋如何處理此類數據。簡單地連接元素,就好像所有T都在一個vector?在這種情況下,你可能會嘗試創建一個新的迭代器來完成這件事。

升壓迭代器庫可以在這方面幫助:

http://www.boost.org/doc/libs/1_48_0/libs/iterator/doc/index.html

+0

感謝您的建議。詳細說明一下,我想以這種方式將任何傳入的內容寫入文本文件:ifstream ifs(「test.txt」,ifstream :: in); ifs <<數據。如果數據是一個向量,那麼我必須迭代它,如果數據是一個整數,那麼我不會。如果數據是T [] [],那麼我也必須迭代...我知道std :: algorithm和函數,如for_each(...);然而,我不明白他們會如何幫助,如果用戶傳入一個int或char。此外,我不相信我可以使用std :: for_each來處理像std :: vector >這樣的東西。 – 2012-02-21 07:16:05