2017-04-03 61 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()

相關問題