LINUX.ORG.RU

Автовывод параметров шаблона

 


0

1

Превит.

Имеется конкретная задача (хотелка) - передавать в конструктор 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.

★★

Блин, только отправил и понял - всё ведь готово уже, только объединить нужно:

template <size_t U>
struct S {
	S(array<int, U>) {}
	S(const int(&ar)[U]) {}
};

int main() {
	array<int, 5> a;
	S s2{ {3,4,5} };
	S s3(a);
}

Вопрос снимаю.

kvpfs ★★
() автор топика

Шаблоны C++. Справочник разработчика 2-е издание. Дэвид Вандевурд, Николаи М. Джосаттис, Дуглас Грегор

Есть в сети, рекомендую.

AntonI ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.