Это пример кода с сайта cppreference.com. Какой из трех вариантов включения перегруженных вариантов foo является предпочтительным? Я, помнится, где-то сталкивался с утверждением, что один из них уязвим, т.е. можно передать аргумент ф-ии во втором случае, кажется.
И вообще, как понимать корректно этот синтаксис? В первом случае понятно, там второй параметр - тип, он возвращается как тип возвращаемого значения у функции. А случаи 2 и 3 - как forward-declaration для типов? Например, второй случай: (T t, TYPE* = 0)
- запись примерно такая, т.е. какой TYPE
мы получим? void
видимо. А что будет, если пытаться передать в эту функцию второй аргумент?
Аналогично вопрос про третий случай - как понимать запись class = ...
?
А в случае с классом, я так понимаю, тоже void
в случае успеха получаем и ошибку компиляции иначе. Не совсем четко понимаю, зачем это нужно template<class T, class Enable = void> class A
.
#include <type_traits>
#include <iostream>
// Включение перегруженных вариантов foo1 при помощи возвращаемого типа
template<class T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type
foo1(T t)
{
std::cout << "foo1: float\n";
return t;
}
template<class T>
typename std::enable_if<std::is_integral<T>::value, T>::type
foo1(T t)
{
std::cout << "foo1: int\n";
return t;
}
// Включение перегруженных вариантов foo2 при помощи дополнительного неиспользуемого параметра
template<class T>
T foo2(T t, typename std::enable_if<std::is_integral<T>::value >::type* = 0)
{
return t;
}
// Включение перегруженных вариантов foo3 при помощи дополнительного параметра шаблона
template<class T ,
class = typename std::enable_if<std::is_integral<T>::value>::type >
T foo3(T t) // обратите внимание, сигнатура функции не меняется
{
return t;
}
// Включение объявления класса A при помощи дополнительного шаблонного параметра
template<class T, class Enable = void>
class A; // еще неопределенный (undefined) класс
template<class T>
class A<T, typename std::enable_if<std::is_floating_point<T>::value >::type> {
};
int main()
{
foo1(1.2); // OK, будет вызвана первая версия foo1()
foo1(10); // OK, будет вызвана вторая версия foo1()
// foo2(0.1); // ошибка времени компиляции
foo2(7); // OK
// A<int> a1; // ошибка времени компиляции
A<double> a1; // OK
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Доброго времени суток! Решал задачу, условие прилагаетсяПроблема в том, что на одном тесте выдает ошибку времени (ограничение в полсекунды)
Хочу реализовать удаление и появления фотографий с использованием классов
Делаю цикл, обрабатывая json массив, получаю в итоге переменную с кучей option которые нужно вставить в начало select, делаю prepend и он вставляет их перевернутымиПробовал...