我们可以使用 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 将独立决定它将获得什么,因此在第二种方法中比较 intdouble 是完全有效的。

我终于找到了问题的答案: 如果我们使用 C++20 语言标准,我们可以使用缩写函数模板。它们更易于输入和理解,因为它们产生的句法混乱更少。

请注意,我们的两个片段并不相同。顶部的强制 x 和 y 是同一类型,而底部的则不是。