如果推断出其中一个参数,是否可以不指定所有模板参数?

时间:2015-11-29 21:38:23

标签: c++ templates c++11 type-deduction

假设我有这样的功能:

template <typename T>
void f(T& x);

由于类型扣除,我可以在不指定类型的情况下使用它:

f(5.0f); // same as f<float>(5.0f);

假设我改变了功能:

template <typename T, int N>
void f(T& x);

即使可以推断出类型,我现在也必须这样称呼它

f<float, 5>(5.0f);

但我希望有这样的事情:

f<auto, 5>(5.0f); // or something like f<5>

到目前为止,我找到了一种方法:

template <int N>
struct F {
    template <typename T>
    static void f(T& x) {
         ...
    }
}

所以我现在可以使用:

F<5>::f(5.0f);

还有其他办法吗?

1 个答案:

答案 0 :(得分:3)

为什么不改变模板参数的顺序:

template <int N, typename T>
void f(T& x) {
  // ...
}

并称之为:

double a;
...
f<1>(a);

编辑:

您还可以使用相反顺序的模板参数提供函数的两个模板重载,并使用如下所示的一个默认参数:

template <typename T, int N = 5>
void f(T& x) {
  // ...
}

template <int N, typename T = double>
void f(T& x) {
  // ...
}

并交替称呼它:

double a = 4.0;
f(a);
f<2>(a);
f<double, 1>(a);
f<double>(a); 

Live Demo