2017-04-03 30 views
2

我有两种或不同类型的std::vector如何编写一般std :: vector push_back的模板函数?

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})回VS如果std::vector<data>s.push_back({1,2,3});

+1

如何确定“{1}”和“{1,2,3}”?你如何确定你用*填充向量*是非常重要的。 – jwimberley

+0

不太确定,但希望std ::向量和std ::向量将帮助编译器确定 –

+0

@vanta为什么不是'{1,2,3}'而不是'{7,8,9}'? – Yakk

回答

3

忘了模板说。简单重载应解决您的问题:

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

void my_function(int n) { 
    val1.push_back(n); 
} 
+0

我知道你的方式非常简单。但好奇的头脑仍然问题是我想要实现的是不可能的?它可行吗? –

1

似乎要专注你的模板功能, 比如,你可以这样做:

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); 
} 
0

不知道这是你在寻找什么?

你可以templatize my_function() espliciting 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()

相关问题