Я использую следующий шаблон SFINAE для оценки предиката в списке вариационного типа:
#include <type_traits>
void f(int = 0); // for example
template<typename... T,
typename = decltype(f(std::declval<T>()...))>
std::true_type check(T &&...);
std::false_type check(...);
template<typename... T> using Predicate = decltype(check(std::declval<T>()...));
static_assert(!Predicate<int, int>::value, "!!");
static_assert( Predicate<int>::value, "!!");
static_assert( Predicate<>::value, "!!"); // fails
int main() {
}
К моему удивлению, перегрузка многоточия выбирается, когда check
вызывается с пустым списком аргументов, поэтому Predicate<>
есть std::false_type
, даже если справедливо выражение SFINAE!
Не следует ли, чтобы вариационные шаблоны функций были предпочтительнее функций многоточия?
Есть ли способы обхода?