模板参数列表中的第一个参数如何跳过表单调用参数?
How the first argument in template parameters list getting skipped form call parameters?
我正在尝试找出当我们在 C++ 中使用模板时如何推导参数,我遇到了一个对我来说很奇怪的情况。
根据我的理解,模板参数应该出现在调用参数中。
但在下面的代码中,我试图跳过第一个模板参数,代码编译并运行良好。
我觉得我的理解有问题。
这只是一个实验代码:
#include <iostream>
#include <cstring>
#include <string>
#include <typeinfo>
using namespace std;
template <typename T, typename T1>
T1 const& max (T1 const & a, T1 const & b) //"typename T" is not present here
{
cout<<"inside func max a: "<<typeid(a).name()<<endl;
cout<<"inside func max b: "<<typeid(b).name()<<endl;
return a < b ? b : a;
}
int main ()
{
::max<double>(7, 42);
cout<<typeid(::max<double>(7, 42)).name();
}
这段代码运行良好,没有错误。但是它如何设法跳过 typename T 参数。有人可以对此进行解释或提供一些 link 吗?
how it managed to skip typename T parameter
T
明确指定为 double
。 T1
可能是 deduced 来自参数。
In order to instantiate a function template, every template argument must be known, but not every template argument has to be specified. When possible, the compiler will deduce the missing template arguments from the function arguments.
给定
::max<double>(7, 42); // T is specified as double, T1 is deduced as int from 7 and 42
你也可以指定T1
,比如
::max<double, long>(7, 42); // T is specified as double, T1 is specified as long
// then 7 and 42 will be converted to long when being passed
请注意,只能推导出 T1
(从参数);您必须始终明确指定 T
。
我正在尝试找出当我们在 C++ 中使用模板时如何推导参数,我遇到了一个对我来说很奇怪的情况。
根据我的理解,模板参数应该出现在调用参数中。 但在下面的代码中,我试图跳过第一个模板参数,代码编译并运行良好。 我觉得我的理解有问题。
这只是一个实验代码:
#include <iostream>
#include <cstring>
#include <string>
#include <typeinfo>
using namespace std;
template <typename T, typename T1>
T1 const& max (T1 const & a, T1 const & b) //"typename T" is not present here
{
cout<<"inside func max a: "<<typeid(a).name()<<endl;
cout<<"inside func max b: "<<typeid(b).name()<<endl;
return a < b ? b : a;
}
int main ()
{
::max<double>(7, 42);
cout<<typeid(::max<double>(7, 42)).name();
}
这段代码运行良好,没有错误。但是它如何设法跳过 typename T 参数。有人可以对此进行解释或提供一些 link 吗?
how it managed to skip typename T parameter
T
明确指定为 double
。 T1
可能是 deduced 来自参数。
In order to instantiate a function template, every template argument must be known, but not every template argument has to be specified. When possible, the compiler will deduce the missing template arguments from the function arguments.
给定
::max<double>(7, 42); // T is specified as double, T1 is deduced as int from 7 and 42
你也可以指定T1
,比如
::max<double, long>(7, 42); // T is specified as double, T1 is specified as long
// then 7 and 42 will be converted to long when being passed
请注意,只能推导出 T1
(从参数);您必须始终明确指定 T
。