C++ 如果推导出一个模板参数,是否可以不指定所有模板参数?
假设我有这样一个函数:C++ 如果推导出一个模板参数,是否可以不指定所有模板参数?,c++,templates,c++11,type-deduction,C++,Templates,C++11,Type Deduction,假设我有这样一个函数: template <typename T> void f(T& x); f<auto, 5>(5.0f); // or something like f<5> 模板 无效f(T&x); 我可以在不指定类型的情况下使用它,因为类型扣除: f(5.0f); // same as f<float>(5.0f); f(5.0f);//与f(5.0f)相同; 假设我更改函数: template <typenam
template <typename T>
void f(T& x);
f<auto, 5>(5.0f); // or something like f<5>
模板
无效f(T&x);
我可以在不指定类型的情况下使用它,因为类型扣除:
f(5.0f); // same as f<float>(5.0f);
f(5.0f);//与f(5.0f)相同;
假设我更改函数:
template <typename T, int N>
void f(T& x);
模板
无效f(T&x);
我现在不得不这样称呼它,即使可以推断出它的类型
f<float, 5>(5.0f);
f(5.0f);
但我想要这样的东西:
template <typename T>
void f(T& x);
f<auto, 5>(5.0f); // or something like f<5>
f(5.0f);//或者类似f的东西
到目前为止,我已经找到了这样做的方法:
template <int N>
struct F {
template <typename T>
static void f(T& x) {
...
}
}
模板
结构F{
模板
静态空隙f(T&x){
...
}
}
因此,我现在可以使用:
F<5>::f(5.0f);
F::F(5.0f);
还有其他方法吗?为什么不更改模板参数的顺序:
template <int N, typename T>
void f(T& x) {
// ...
}
模板
空f(T&x){
// ...
}
把它叫做:
double a;
...
f<1>(a);
双a;
...
f(a);
编辑:
您还可以为函数提供两个模板重载,其中模板参数的顺序相反,一个默认参数如下所示:
template <typename T, int N = 5>
void f(T& x) {
// ...
}
template <int N, typename T = double>
void f(T& x) {
// ...
}
模板
空f(T&x){
// ...
}
模板
空f(T&x){
// ...
}
可以互换地称之为:
double a = 4.0;
f(a);
f<2>(a);
f<double, 1>(a);
f<double>(a);
双a=4.0;
f(a);
f(a);
f(a);
f(a);
你到底想做什么?@Matstpeterson为什么这很重要?这看起来不像是XY问题。@matstpeterson问这个问题的原因是,不,该语言没有这种语法
f()
,因此解决方案是重构、重新设计,或者让它始终指定参数。根据您的问题,您可以对参数重新排序,或者使用找到的结构或其他方式。但没有普遍的解决办法。只是针对特定问题量身定做的变通方法。101010回答了这个问题,没有详细说明。改变模板参数顺序确实解决了这个问题。一种可能的情况是template…
,但同样,这取决于人们希望实现什么。不知道这是可能的。谢谢我会尽快接受它。如果您有时想使用f
,有时想使用f
,该怎么办?@immibisauto
说明符不允许作为模板参数。@101010顺便问一下,为什么重新排序可以这样做?如果我有两个以上的参数,我想这会起作用,所以如果其他参数是推导出来的,我只能指定其中的一些参数?@101010你很清楚,auto
是这里的假设语法。