2012-01-26 59 views
1

我有兩個非常相似的函數,我想從它們中創建一個模板函數。如何爲此製作模板函數?

void func1(vector<vector<vector<struct1_type> > > &struct1_x, const int &x, 
const int &y, struct2_type &struct2_y, list1<struct1_type> &l1) 

void func2(vector<vector<vector<struct1_type> > > &struct1_x, const int &x, 
const int &y, struct2_type &struct2_y, list2<struct1_type> &l2) 

的功能做同樣的事情......唯一不同的就是最後一個參數,這是兩個不同的類如何處理名單。

我已經嘗試了許多事情,沒有結果和錯誤的囤積。感謝您提供任何幫助,您可以提供一個相對的新手!

回答

0

這是你將如何聲明可以推廣你的兩個函數聲明函數模板:

template <typename L> 
void func1(vector<vector<vector<struct1_type> > > &struct1_x, const int &x, const int &y, struct2_type &struct2_y, L &q1) 

那是你的意思?

2

這就是template template的發明。

template <template <typename> class list_type> 
void func1(vector<vector<vector<struct1_type> > > &struct1_x, 
      const int &x, 
      const int &y, 
      struct2_type &struct2_y, 
      list_type<struct1_type> &q1); 

不過請注意,該模板具有匹配準確。例如,對於list_type參數,您不能使用std::list,因爲它不包含一個模板參數 - 它需要兩個:包含的類型和分配器類型。

使用簡單的非template template解決方案可能會更簡單。

template <typename list_type> 
void func1(vector<vector<vector<struct1_type> > > &struct1_x, 
      const int &x, 
      const int &y, 
      struct2_type &struct2_y, 
      list_type &q1); 

並期望用戶指定list1<struct1_type>作爲模板參數。這是std::stack,std::queuestd::priority_queue所做的。