Шаблоны функций и автоматическое ключевое слово
Может ли ключевое слово 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
}