如何为通用标准::矢量push_back编写模板函数

How to write template function for general std::vector push_back?

本文关键字:back 函数 矢量 标准 push      更新时间:2023-10-16

我有两种或不同类型的std::vector

struct data{
   int a;
   int b;
   int c;
};
std::vector<int>  val1;
std::vector<data> val2;

现在我想编写一个适用于val1val2的模板函数。

template<typename t>
void my_function(t s){
    s.push_back(...); // based on s i.e it could be std::vector<int> or std::vector<data> 
}
my_function<std::vector<int>>(val1);
my_function<std::vector<data>>(val2);

面临的问题是我如何在代码中说,如果类型std::vector<int>则推回s.push_back({1})std::vector<data>是否执行s.push_back({1,2,3});

忘记模板。简单的重载应该可以解决您的问题:

void my_function(const data& d) {
  val2.push_back(d);
}
void my_function(int n) {
  val1.push_back(n);
}

似乎您想专门化您的模板函数,例如,您可以执行以下操作:

struct data{
   int a;
   int b;
   int c;
};
std::vector<int>  val1;
std::vector<data> val2;
template<typename t> void my_function(t s);
template<>
void my_function(std::vector<int> s){
    s.push_back({1}); 
}
template<>
void my_function(std::vector<data> s){
    s.push_back({1,2,3}); 
}
int main()
{
    my_function(val1);
    my_function(val2);
}

不确定这是你要找的...

您可以模板化my_function() std::vector并提取以这种方式包含的类型

template <typename T>
void my_function(std::vector<T> & s)
 { s.push_back(getTval<T>()); }

(题外话:注意我为参数s添加了一个&;否则您将向量s作为副本传递,并且push_back()仅在从函数退出时销毁的副本中添加一个值(

但是这个解决方案并没有避免对函数专业化的需求;它只是在实现getVal()时移动了这种需求。

template <typename T>
T getTval ();
template <>
int getTval<int> ()
 { return 1; }
template <>
data getTval<data> ()
 { return {1, 2, 3}; }

如果my_function()是一个伟大而复杂的解决方案,其中push_back()是向量中包含的数据更改代码的唯一点,那么这可能很有用。否则,我想可以更好地重载或专门化相同的my_function().