是否可以使特定函数覆盖通用模板函数?

时间:2017-11-09 17:45:28

标签: c++ templates

所以,我正在创建一个序列化库,我希望将各种数据类型保存到字符串流,然后base64编码该字符串流的字符串,然后将其保存到文件中。除了我必须完成几十个和几十个类似的功能之外,它一切运作良好。使用模板的好地方,对吗?

嗯,我不确定如何这样做,因为虽然很多功能非常相似

int save(stringstream&, const int);
int save(stringstream&, const unsigned int);
int save(stringstream&, const unsigned char);

int SaveLoad::Save(stringstream & saveStream, const unsigned int input)
{
   saveStream << input << Delimiter;
   return 1;
}

其中一些,比如

int save(stringstream&, const vector<int>);

需要特殊处理:

int SaveLoad::Save(stringstream& saveStream, const vector<int> input)
{
  unsigned int length = input.size();
  Save(saveStream, length);
  for (unsigned int i = 0; i < length; i++)
  {
    Save(saveStream, input[i]);
  }
  return 1;
 }

以便他们从字符串流中正确存储和加载数据。别担心,甚至会有更多自定义保存/加载程序的类。

有没有办法去做我想要的事情?或者有没有办法让模板函数只采用特定类型的类型?

1 个答案:

答案 0 :(得分:1)

回答您的编程问题:

template<typename T>
int SaveLoad::Save(stringstream & saveStream, const T& input)
{
   saveStream << input << Delimiter;
   return 1;
}

template<typename T>
int SaveLoad::Save(stringstream& saveStream, const vector<T>& input)
{
  unsigned int length = input.size();
  Save(saveStream, length);
  for (unsigned int i = 0; i < length; i++)
  {
    Save(saveStream, input[i]);
  }
  return 1;
 }

回答关于序列化的更广泛的问题:c ++的结帐cereal serialization library