int vsa_d(...); // can take any number of arguments
Здесь vsa_d
может принимать любое количество аргументов.
Таким образом, он должен использоваться для чего-либо вроде «резервной перегрузки» в «SFINAE».
Что это значит?
Пример:
template <typename T>
struct has_f {
template <typename U, typename = decltype(std::declval<U&>().f())>
static std::true_type foo(U);
static std::false_type foo(...);
using type = typename decltype(foo(std::declval<T>()))::type;
};
struct a {
void f(){}
};
Здесь foo
имеет две перегрузки:
template <typename U, typename = decltype(std::declval<U&>().f())>
static std::true_type foo(U);
Если выражение decltype(std::declval<U&>().f()
допустимо, то, что бы мы ни называли has_f
, действительно имеет функцию f
, и эта перегрузка будет выбрана.
В противном случае будет выбрана функция-не шаблонный элемент
static std::false_type foo(...);
Потому что он имеет самый низкий приоритет.
Вызов
std::cout << std::boolalpha << has_f<a>::type();
дает
true