用于数组、向量、内置类型、STL的C++模板函数

C++ template function for arrays, vectors, built in types, STL

本文关键字:C++ 函数 置类型 数组 向量 内置 用于 STL      更新时间:2023-10-16

我想创建一个类,该类具有将发送给它的数据保存到文本文件的函数。可以传递给它的数据可以是std::stringintdoublefloatunsigned int等,也可以是: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);
};

假设T是内置类型(如intfloat或其他类型),则std::string的代码将与std::vector<T>的代码相同。

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

首先,您可以对类或函数进行模板化。由于您也想执行数组,因此必须使用后一个选项。示例如下:

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. 参数也应该是引用(即"&data"而不是"data"),这样每次调用函数时只传递引用,而不是执行整个容器的副本
  2. 我已经明确地将函数声明为public,假设这是一个完整的类,并且它的函数将被另一个类访问。默认情况下,类的成员是私有的
  3. 确保每个嵌套的">"之间有一个空格

祝你好运

我认为您将两件事混合在一个类中,这是应该避免的:据我所见,您的类的作用(其"职责")是将数据写入文件。您添加的另一件事是关于迭代数据集合的知识。

看看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