我们可以使用 auto 关键字而不是模板吗?
Can we use auto keyword instead of template?
我们可以使用 auto 关键字代替模板吗?
考虑以下示例:
#include <iostream>
template <typename T>
T max(T x, T y) // function template for max(T, T)
{
return (x > y) ? x : y;
}
int main()
{
std::cout << max<int>(1, 2) << '\n'; // instantiates and calls function max<int>(int, int)
std::cout << max<int>(4, 3) << '\n'; // calls already instantiated function max<int>(int, int)
std::cout << max<double>(1, 2) << '\n'; // instantiates and calls function max<double>(double, double)
return 0;
}
所以我们也可以这样写:
#include <iostream>
auto max(auto x, auto y)
{
return (x > y) ? x : y;
}
int main()
{
std::cout << max(1, 2) << '\n';
std::cout << max(4, 3) << '\n';
std::cout << max(1, 2) << '\n';
return 0;
}
那么,为什么要使用 auto 关键字而不是模板?
正如@HolyBlackCat 在评论中所说,片段是不一样的。
在使用模板的第一个片段中,您将 T max(T x, T y)
的参数限制为同一类型。所以如果你采用模板方法,下面的代码将不起作用:
int x = 3;
double y = 5.4;
max(3, 5.4);
但是,如果采用第二种方法,则可以比较两种不同的数据类型(当然,如果允许的话)。这是因为两个参数的 auto 将独立决定它将获得什么,因此在第二种方法中比较 int
和 double
是完全有效的。
我终于找到了问题的答案:
如果我们使用 C++20 语言标准,我们可以使用缩写函数模板。它们更易于输入和理解,因为它们产生的句法混乱更少。
请注意,我们的两个片段并不相同。顶部的强制 x 和 y 是同一类型,而底部的则不是。
我们可以使用 auto 关键字代替模板吗?
考虑以下示例:
#include <iostream>
template <typename T>
T max(T x, T y) // function template for max(T, T)
{
return (x > y) ? x : y;
}
int main()
{
std::cout << max<int>(1, 2) << '\n'; // instantiates and calls function max<int>(int, int)
std::cout << max<int>(4, 3) << '\n'; // calls already instantiated function max<int>(int, int)
std::cout << max<double>(1, 2) << '\n'; // instantiates and calls function max<double>(double, double)
return 0;
}
所以我们也可以这样写:
#include <iostream>
auto max(auto x, auto y)
{
return (x > y) ? x : y;
}
int main()
{
std::cout << max(1, 2) << '\n';
std::cout << max(4, 3) << '\n';
std::cout << max(1, 2) << '\n';
return 0;
}
那么,为什么要使用 auto 关键字而不是模板?
正如@HolyBlackCat 在评论中所说,片段是不一样的。
在使用模板的第一个片段中,您将 T max(T x, T y)
的参数限制为同一类型。所以如果你采用模板方法,下面的代码将不起作用:
int x = 3;
double y = 5.4;
max(3, 5.4);
但是,如果采用第二种方法,则可以比较两种不同的数据类型(当然,如果允许的话)。这是因为两个参数的 auto 将独立决定它将获得什么,因此在第二种方法中比较 int
和 double
是完全有效的。
我终于找到了问题的答案: 如果我们使用 C++20 语言标准,我们可以使用缩写函数模板。它们更易于输入和理解,因为它们产生的句法混乱更少。
请注意,我们的两个片段并不相同。顶部的强制 x 和 y 是同一类型,而底部的则不是。