Что я должен написать вместо троеточия, чтобы количество аргументов, принимаемое функцией set было равно аргументу шаблона S? Я, конечно, могу написать там parameter pack и проверить sizeof... через static_assert, но хочется чтобы красиво, и неверных перегрузок просто не существовало. Ну и грядок enable_if тоже не хочется.
Re: Количество аргументов функции как параметр шаблона
Went:
W>Что я должен написать вместо троеточия, чтобы количество аргументов, принимаемое функцией set было равно аргументу шаблона S? Я, конечно, могу написать там parameter pack и проверить sizeof... через static_assert, но хочется чтобы красиво, и неверных перегрузок просто не существовало. Ну и грядок enable_if тоже не хочется.
Без наследования это, скорее всего, невозможно. С помощью наследования от специализированных шаблонов такое можно провернуть, но подобные финты будут явно посложнее enable_if и не очень-то красивыми: http://coliru.stacked-crooked.com/a/b22515b132b1aa2d
Re[2]: Количество аргументов функции как параметр шаблона
Здравствуйте, niXman, Вы писали:
X>http://coliru.stacked-crooked.com/a/26310b85c2490e9f
Спасибо, но это — решение наоборот. Мне нужно по заранее известному параметру класса указать количество аргументов функции-члена.
Re[2]: Количество аргументов функции как параметр шаблона
Здравствуйте, niXman, Вы писали: X>enable_if, имхо, самый разумный вариант... X>http://coliru.stacked-crooked.com/a/a76bf9f72a67b833
Спасибо! Отличное решение! Такого способа использовать enable_if я не придумал Я предполагал кучу перегрузок, из которых отключаются все кроме одной, но это решение весьма элегантно.
Re[2]: Количество аргументов функции как параметр шаблона
Здравствуйте, niXman, Вы писали:
X>enable_if, имхо, самый разумный вариант... X>http://coliru.stacked-crooked.com/a/a76bf9f72a67b833
Кстати, 2013-ый вижуал это не варит, говорит, что type у enable_if не определен. Выходит, у него SFINAE сбоит или что-то из стандарта не реализовано?
Re[3]: Количество аргументов функции как параметр шаблона
Здравствуйте, N. I., Вы писали:
NI>Без наследования это, скорее всего, невозможно. С помощью наследования от специализированных шаблонов такое можно провернуть, но подобные финты будут явно посложнее enable_if и не очень-то красивыми: http://coliru.stacked-crooked.com/a/b22515b132b1aa2d
Не так уж плох этод подход, имхо. Во-первых потому, что получить размер из пака типов значительно проще, чем пак типов из размера. Во-вторых потому, что этот пак типов будет нужен постоянно, как я догадываюсь, и то, что он есть всегда под рукой должно упростить определение внутренностей вектора, обеспечить строгость в соблюдении соответствия типов.
Пара корректировок по коду. Реализацию gen_type_pack можно слегка упростить использованием std::index_sequence:
Здравствуйте, rg45, Вы писали: R>Тут вот ведь какая штука, если я правильно понимаю задумку, никакие другие типы, кроме T эта функция принимать не должна.
Ну, вообще-то, да.
Re[8]: Количество аргументов функции как параметр шаблона
Здравствуйте, Went, Вы писали:
R>>Тут вот ведь какая штука, если я правильно понимаю задумку, никакие другие типы, кроме T эта функция принимать не должна. W>Ну, вообще-то, да.
Ну конечно же! В противном случае выходит, что мы организовали контроль количества параметров, пожертвовав котролем соответствия типов. Теперь при любом несоответствии типов все предупреждения и ошибки будут возникать внутри функции set, а не в клиентском коде.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: Количество аргументов функции как параметр шаблона
rg45:
R>Пара корректировок по коду. Реализацию gen_type_pack можно слегка упростить использованием std::index_sequence:
Ну, в общем, да, то был чисто рукопашно написанный код. Правда, вспомогательные шаблоны вполне реюзабельны для других целей. Поэтому, кстати, нет особого смысла жадничать с отбрасыванием определения у type_pack. Мне, например, как-то надо было передать нечто вроде type_pack<Types...>() в шаблон функции, чтоб та вывела Types из переданного аргумента. Явно указать Types... для шаблона функции не было возможности из-за использования там ещё одного пака. Будь type_pack<Types...> неполным типом, пришлось бы передавать туда что-то наподобие (type_pack<Types...> *)nullptr, что, по-моему, несколько менее красиво, чем более простое type_pack<Types...>().
R>При этом сам vector имеет смысл сделать простым алиасом vector_base, подобно тому, как std::string является алиасом std::basic_string: R>
Здравствуйте, N. I., Вы писали:
NI>Будь type_pack<Types...> неполным типом, пришлось бы передавать туда что-то наподобие (type_pack<Types...> *)nullptr, что, по-моему, несколько менее красиво, чем более простое type_pack<Types...>().
std::declval<type_pack<Types...>>()?
Он же и нужен как раз при реализации всяких метафункций. Если требуется полнота, можно юзать std::tuple. Кстати, мне странно, что в стандартной библиотеке нет аналога такого вот type_pack, я уже множество раз сталкивался со случаями, когда он быд бы полезен.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[7]: Количество аргументов функции как параметр шаблона
Здравствуйте, rg45, Вы писали:
R>Тут вот ведь какая штука, если я правильно понимаю задумку, никакие другие типы, кроме T эта функция принимать не должна.
запросто: http://coliru.stacked-crooked.com/a/1572113a95efa1cd
вот только метафункция std::conjunction присутствует только в С++17. посему, для msvc2013 пришлось ее скопипастить в свой код.
реализацию можно вкопипа
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[8]: Количество аргументов функции как параметр шаблона
W>Что я должен написать вместо троеточия, чтобы количество аргументов, принимаемое функцией set было равно аргументу шаблона S? Я, конечно, могу написать там parameter pack и проверить sizeof... через static_assert, но хочется чтобы красиво, и неверных перегрузок просто не существовало. Ну и грядок enable_if тоже не хочется.