数组,向量,内置类型,STL的C ++模板函数

时间:2012-02-21 06:49:18

标签: c++ templates

我想创建一个具有将发送给它的数据保存到文本文件的函数的类。可以传递给它的数据可以是std::stringintdoublefloatunsigned 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是内置类型(如intfloat或其他)。

然后我相应地为每个SaveData(...)编写函数?

2 个答案:

答案 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. 参数也应该是引用(即“&amp; data”而不是“data”),因此每次调用函数时,只传递引用而不是执行整个容器的副本。
  2. 我已经明确地将这些函数声明为public,假设这是完整的类,并且其函数将被另一个类访问。默认情况下,类的成员是私有的。
  3. 确保每个嵌套的“&gt;”之间都有空格。
  4. 祝你好运!

答案 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;
  }

这使您可以独立于使用vectorlist,数组还是其他任何内容。

如果您还要序列化vector<vector<T> >之类的内容(请注意两个>之间的空格!),您必须详细说明您要对此类数据执行的操作。简单地连接元素就好像所有T都在一个vector中一样?在这种情况下,您可能会尝试创建一个新的迭代器,它正是这样做的。

boost迭代器库可以帮助解决这个问题:

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