假设我有一个这样的函数:

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);

还有其他方法吗?

最佳答案

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

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

10-06 10:39
查看更多