用模板类作为参数编写函数的C ++快捷方式

时间:2016-07-14 16:06:41

标签: c++ templates default-value

当大多数特定模板参数不重要时,是否存在编写函数的快捷方式,该函数将模板化类作为参数?

给出

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是无关紧要的。有没有办法避免写作

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到E的实例。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

尝试可变参数模板:

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

对于此声明,有多少模板参数并且它们的类型是什么并不重要。唯一的限制是xy都必须使用相同的类型集进行实例化。如果不需要此限制,请参阅Yakk的答案。如果需要,它还允许您编写部分特化。

答案 2 :(得分: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