Шаблоны функций и автоматическое ключевое слово

Может ли ключевое слово auto в С++ 11 заменить шаблоны функций и специализации? Если да, каковы преимущества использования шаблонных функций и специализаций по сравнению с простым вводом параметра функции как auto?

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

против

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

Ответ 1

Вкратце, 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

Можно ли заменить ключевое слово auto на С++ 11 шаблонами функций и специализациями?

Нет. Есть предложения использовать ключевое слово для этой цели, но это не в С++ 11, и я думаю, что С++ 14 разрешит это только для полиморфных lambdas, а не для шаблонов функций.

Если да, в чем преимущества использования функций и спецификаций шаблонов, просто набирая параметр функции как auto.

Вам все равно может потребоваться параметр именованного шаблона, если вы хотите обратиться к типу; это было бы более удобно, чем std::remove_reference<decltype(arg)>::type или что-то еще.

Ответ 3

Единственное, что отличает ключевое слово auto от template, это то, что вы не можете создать универсальный класс, используя ключевое слово 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
}