假设我有一个这样的函数:
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