1) Почему пакет параметров используется в EnableIf ()> .... Если я удаляю ..., то код завершается ошибкой при компиляции. Я не могу вывести точную ошибку из трассировки, и почему это ... нужно вообще там? (скомпилировано с G CC 7.4.0).
Посмотрите на EnableIf<IsTradingSymbol<T>()>
.
Это
template <bool b>
using EnableIf = typename std::enable_if<b, int>::type;
Так же, как и int
, когда условие true
, в противном случае ничего.
Предположим, что условие IsTradingSymbol<T>()
истинно; так что
template <Type T, EnableIf<IsTradingSymbol<T>()>...>
bool GetErrorForUi(Type A) {
return true;
}
становится
template <Type T, int ...>
bool GetErrorForUi(Type A) {
return true;
}
Теперь у вас есть функция шаблона. Требуются некоторые, не выводимые из аргументов, параметры: a Type
(T
), который является обязательным, и список целых чисел, ноль или более.
Вы вызываете функцию следующим образом
GetErrorForUi<Type::First>(Type::First);
Таким образом, вы передаете функции в качестве параметра шаблона только Type
. Не целые числа.
Это работает, потому что функция ожидает ноль или более целых чисел.
Но когда вы удалите многоточие (...
), функция станет
template <Type T, int>
bool GetErrorForUi(Type A) {
return true;
}
Теперь GetErrorForUi()
ожидают два параметра шаблона: a Type
и int
. Ровно один int
, не более нуля или более.
Теперь одно целое число является обязательным и допустимо только одно.
Так что теперь вызов
GetErrorForUi<Type::First>(Type::First);
не делает t работает (выдает ошибку компиляции), потому что вы не передаете обязательный параметр шаблона int
.
А также
GetErrorForUi<Type::First, 0, 1>(Type::First);
не работает (после удаления многоточия; компилировать), потому что функции ожидают ровно одно целое число, и вы передаете два int
s.
Это также должно ответить на ваш второй пункт.