Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果推导出一个模板参数,是否可以不指定所有模板参数?_C++_Templates_C++11_Type Deduction - Fatal编程技术网

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
,该怎么办?@immibis
auto
说明符不允许作为模板参数。@101010顺便问一下,为什么重新排序可以这样做?如果我有两个以上的参数,我想这会起作用,所以如果其他参数是推导出来的,我只能指定其中的一些参数?@101010你很清楚,
auto
是这里的假设语法。