2016-07-14 41 views
0

當大多數特定的模板參數無關緊要時,是否有寫入將模板類作爲參數的函數的快捷方式?以模板類作爲參數編寫函數的C++快捷方式

鑑於

template<typename A, typename B, typename C, typename D, typename E> 
class Foo 

我想寫

template<typename A> 
int metric(Foo<A> x, Foo<A> y) 
在這種情況下

,模板參數B到E無關。有沒有一種方法,以避免到E寫

template<typename A, typename B, typename C, typename D, typename E> 
int metric(Foo<A, B, C, D, E> x, Foo<A, B, C, D, E> y) 

參數B已經違約,但我想度量的所有實例的工作,而不僅僅是通過E.使用B的默認值

回答

4
template<class A, class...Ts,class...Us> 
int metric(Foo<A, Ts...> x, Foo<A, Us...> y) 

這允許兩個Foo類型不同。如果你想在同一只:

template<class A, class...Ts> 
int metric(Foo<A, Ts...> x, Foo<A, Ts...> y) 
+0

有沒有一種方式,如果一個做到這一點的模板參數是值而不是類型名(例如,'template ')? – Zack

+1

@zack不是真的。如果您想要良好的元編程支持,請避免使用非類型的模板參數 – Yakk

0

嘗試可變參數模板:

template<typename A, typename ... others> 
int metric(Foo<A, others...> x, Foo<A, others...> y) 

對於此聲明,無論有多少模板參數以及它們的類型如何。唯一的限制是,xy必須使用相同的一組類型實例化。如果這個限制是不需要的,請參閱Yakk的答案。如果需要,它也允許你寫部分專業化。

0

也許你可以聲明度量作爲

template<typename T> 
int metric(T x, T y) 

然後模板參數推導應該工作:

Foo< whatever parameters > f,g; 
int x = metric(f,g);   // no need to specify parameters again