我想创建一个具有将发送给它的数据保存到文本文件的函数的类。可以传递给它的数据可以是std::string
,int
,double
,float
,unsigned int
等等,也可以是an:std::vector<T>
,T[]
和std::vector<std::vector<T>>
,T[][]
。
现在,显然如果它是一个数组,我将需要迭代它以将数据发送到文本文件。
我在考虑使用模板,但我不确定如何使用数组。
这是要走的路吗?
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
是内置类型(如int
或float
或其他)。
然后我相应地为每个SaveData(...)
编写函数?
答案 0 :(得分: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 :(得分: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;
}
这使您可以独立于使用vector
,list
,数组还是其他任何内容。
如果您还要序列化vector<vector<T> >
之类的内容(请注意两个>
之间的空格!),您必须详细说明您要对此类数据执行的操作。简单地连接元素就好像所有T
都在一个vector
中一样?在这种情况下,您可能会尝试创建一个新的迭代器,它正是这样做的。
boost迭代器库可以帮助解决这个问题:
http://www.boost.org/doc/libs/1_48_0/libs/iterator/doc/index.html