函数模板 vs. 自动关键字

38

在C++11中,auto关键字能否代替函数模板和特化?如果可以,使用模板函数和特化的优势是什么,而不是仅仅将函数参数键入为auto

template <typename T>
void myFunction(T &arg)
{
    // ~
}

对比。

void myFunction(auto &arg)
{
    // ~
}

6
C++14 中有一种方式:auto myFunction = [](auto &arg) {...}; - chris
7
C++20将具有此功能:void myFunction(auto &arg) {...}。它的意思是函数myFunction可以接受任何类型的参数,并使用引用进行传递,而无需指定其类型。 - Sadeq
3个回答

16
简单来说,在函数参数中,auto不能用于省略实际类型,因此请使用函数模板和/或重载。 auto 可以合法地用于自动推断变量的类型:
auto i=5;

请非常注意以下内容的区别:

auto x=...
auto &x=...
const auto &x=...
auto *px=...; // vs auto px=... (They are equivalent assuming what is being 
              //                 assigned can be deduced to an actual pointer.)
// etc...

它还用于后缀返回类型:

template <typename T, typename U>
auto sum(const T &t, const U &u) -> decltype(t+u)
{
  return t+u;
}

2
重要的是要明确,自动类型推导在99%的情况下都是好的,但有时你必须停下来思考一下auto到底在做什么。指针可能是auto的一个特殊情况。 - user2485710
1
@user2485710,根据您的评论,我在我的答案中添加了更多信息。 - Michael Goldshteyn

7
可以在C++11中使用auto关键字替代函数模板和特化吗?
不可以。虽然有提议将其用于此目的,但它并不在C++11中,并且我认为C++14仅允许将其用于多态lambda而非函数模板。
如果可以,使用模板函数和特化有哪些优点,而不是简单地将函数参数键入auto
如果您想引用类型,则可能仍需要命名模板参数;这比std::remove_reference<decltype(arg)>::type或其他方式更方便。

5
只有一件事情使得关键字 autotemplate 不同,那就是你不能使用 auto 关键字创建通用的类。
class B { auto a; auto b; }

当您创建上述类的对象时,它会报错。
B b; // Give you an error because compiler cannot decide type so it can not be assigned default value to properties

使用模板,您可以制作一个像这样的通用类:

template <class T> 

class B {
    T a;
};

void main() {
    B<int> b; //No Error
}

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