我们可以使用auto关键字代替模板吗?

4

我们可以使用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关键字而不是模板?


8
为简便起见,如果您希望的话。另请注意,这些代码片段并不相等:第二个可以接受不同类型的参数。 - HolyBlackCat
希望清楚的是,你的第一个版本将打印一个“double”,而你的第二个版本则不会。 - Drew Dormann
@HolyBlackCat 我记得以前看到过这个问题,但现在好像找不到了。如果还没有答案,你可能需要详细说明并把它提升为一个回答 :) - cigien
2个回答

4
正如评论中@HolyBlackCat所说,这些片段不相同。在第一个片段中,当您使用模板时,您将T max(T x, T y)的参数限定为相同类型。因此,如果您采用模板方法,则以下代码将无法正常工作:
int x = 3;
double y = 5.4;
max(3, 5.4);

不过,如果你采用第二种方法,你可以比较两种不同的数据类型(当然如果被允许的话)。这是因为参数的“auto”会独立决定它将要获取的内容,所以在第二种方法中比较一个intdouble是完全有效的。


1

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

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


你的Q例子中一半的“语法混乱”是因为你显式地实例化了模板,这是不必要的。typename T从参数类型推断出来。如果正确使用,模板函数的用法应该与普通函数的用法没有区别。 - DevSolar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接