假设我有这样的功能:
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);
还有其他办法吗?
答案 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);