Здравствуйте, Skorodum, Вы писали:
S>Здравствуйте, Кодт, Вы писали:
S>А про возможность добавления в стандарт чего-то подобного что скажите? Мелочь, а приятно или есть какие-то подводные камни?
Уже 7 лет обсуждают. И как раз из-за подводных камней никак процесс не сойдётся. То поддержка концептов для правильной реализации нужна, то принимается решение не ждать концептов, но всплывают другие проблемы.
Сейчас последняя версия предложения называется вроде как "make_array, revision 3" (rev 3 из-за того, что нумеровать не с начала стали). И судя по тому, что код с последнего предложения опять чуть поменялся, это всё ещё может быть не последняя версия. Но может к C++17 таки добьют — в планах LEWG вроде как есть.
С другой стороны такой низкий темп обсуждения, кажется, немало говорит об реальной востребованности и полезности подобной функциональности.
Здравствуйте, watchmaker, Вы писали:
W>С другой стороны такой низкий темп обсуждения, кажется, немало говорит об реальной востребованности и полезности подобной функциональности.
Пропустил мимо внимания эти обсуждения.
У make_array с выводом типов, вообще, есть применения?
Лично меня как-то настораживают и напрягают попытки привести типы множества аргументов к какому-то наиболее общему.
Начать с того, что это ошибкоопасно. Например, множество указателей на классы из одной иерархии, и указатель на посторонний тип. Наиболее общим будет void*. Ну и получим кучу void*-ов.
Или char'ы и int — при том, что char в int можно привести двумя способами — как код символа (беззнаковый) и как попало (знаковый).
В случае с make_pair и make_tuple мы просто откладываем приведение типов аргументов на самый последний момент, — когда будем сопоставлять с tie, или поместим в контейнер известных типов кортежей, или же вообще какой-то из компонентов кортежа не потребуется.
С make_array такой номер не пройдёт, аргументы приводятся немедленно.
Где что-то такое похожее могло бы пригодиться — это обобщение range-based for
for(auto x : tuple_goes_here(a,b,c,d)) { ..... }
// развернуть в
{ auto x = a; ..... }
{ auto x = b; ..... }
{ auto x = c; ..... }
{ auto x = d; ..... }
На полиморфных лямбдах такую штуку сделать несложно.
К>У make_array с выводом типов, вообще, есть применения?
Так главное и единственное применение — запись сделать короче. Только сокращение числа нажатий на клавиши.
К>Лично меня как-то настораживают и напрягают попытки привести типы множества аргументов к какому-то наиболее общему. К>Начать с того, что это ошибкоопасно.
Ну вот да. В наивной реализации make_array казалось бы можно просто возвращать массив из элементов типа std::common_type от аргументов. Но это даже для простой комбинации int и unsigned будет возвращать несколько неприятный результат. А есть ведь вещи и посложнее целочисленных типов. Так что с make_array главная сложность именно с определением какие преобразования разрешить и как при этом отлавливать их нарушения (а ведь это тоже нужно, если даже в варианте с явно заданным результирующим типом просто делать static_cast для аргументов, то всё равно останется место для ошибки).