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

Jea*_*Luc 5 c++ templates

我想创建一个具有将发送给它的数据保存到文本文件的函数的类.可以传递给它的数据可以像一个东西std::string,int,double,float,unsigned 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);
};
Run Code Online (Sandbox Code Playgroud)

我想,对于代码std::string将是相同的代码std::vector<T>提供了T一个内置式(如一个intfloat什么的).

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

ath*_*tes 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);
};
Run Code Online (Sandbox Code Playgroud)

定义了这些函数后,以下示例显示了如何调用它们:

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);
Run Code Online (Sandbox Code Playgroud)

根据您的要求,您可以使类成为单例并将函数设置为静态,省略了完全实例化CMyClass的需要,只需按如下方式调用函数:

CMyClass::SaveData<int>(i);
CMyClass::SaveData<int>(i1);
CMyClass::SaveData<int>(i2);
CMyClass::SaveData<int>(v1);
CMyClass::SaveData<int>(v2);
CMyClass::SaveData(s);
Run Code Online (Sandbox Code Playgroud)

笔记:

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

祝好运!