Имеется шаблон с параметрами по умолчанию, например:
struct na;
template<
class t0=na
,class t1=na
,class t2=na
,class t3=na
,class t4=na
>
struct holder
{
{enum real_arg_count = ??? }; // как определить количество реально заданных параметров ?
};
Как вариант, что-то вроде meta_if на каждый параметр.
Громоздко и трудно модифицировать.
В связи с этим родился такой вариант:
template<class t=void> struct inc {
enum {value = 1};
};
template<class t> struct inc<inc<t> > {
enum {value = inc<t>::value + 1};
};
template<
class t0=inc<>
,class t1=inc<t0>
,class t2=inc<t1>
,class t3=inc<t2>
,class t4=inc<t3>
>
struct A
{
enum {real_arg_count= 6-inc<t4>::value}; // 6=1+кол-во параметров(5), t4 - последний параметр
};
...
std::cout << A<int, char, float, double, long>::real_arg_count << std::endl; // 5
std::cout << A<int, char, float>::real_arg_count << std::endl; // 3
std::cout << A<>::real_arg_count << std::endl; // 0
Из минусов — поменялся тип параметра.