Превит.
Имеется конкретная задача (хотелка) - передавать в конструктор brace list, автоматически выводитьс size_t параметра шаблона равный количеству членов листа, обойтись без макросов (с макросами знаю как). Т.е:
template <size_t Sz>
struct S {
S(...);
};
int main() {
array<int, 5> a;
S s{ {1,2,3} };
S s2(a);
}
Свои соображения:
Видимо задача должна сводится к написанию deduction гида, из brace list’a может быть выведен initializer_list (но не std::array, например). Метод initializer_list::size() - constexpr, по идее можно использовать для передачи аргументом в шаблонный парметр, но не выходит
#include <array>
#include <initializer_list>
using namespace std;
template <size_t U>
struct S {
S(array<int, U>) {}
};
S(initializer_list<int> l) -> S<l.size()>; // error, можно просто 3, тогда ок, в данном случае
int main() {
S s2{ {3,4,5} };
}
Есть такой вариант
template <size_t U>
struct S {
S(const int(&ar)[U]) {}
};
int main() {
array<int, 5> a;
S s2{ {3,4,5} }; #1
S s2(a); #2 error
}
Но не годится, т.к. #2 не работает. Как бы написать такой хитрый гид? Не вижу причин, которые бы делали невозможным использование компайл тайм инфы о размере std::initializer_list.