用于数组、向量、内置类型、STL的C++模板函数
C++ template function for arrays, vectors, built in types, STL
我想创建一个类,该类具有将发送给它的数据保存到文本文件的函数。可以传递给它的数据可以是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);
};
假设T
是内置类型(如int
或float
或其他类型),则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);
注意:
- 参数也应该是引用(即"&data"而不是"data"),这样每次调用函数时只传递引用,而不是执行整个容器的副本
- 我已经明确地将函数声明为public,假设这是一个完整的类,并且它的函数将被另一个类访问。默认情况下,类的成员是私有的
- 确保每个嵌套的">"之间有一个空格
祝你好运
我认为您将两件事混合在一个类中,这是应该避免的:据我所见,您的类的作用(其"职责")是将数据写入文件。您添加的另一件事是关于迭代数据集合的知识。
看看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
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗