Ограничение набора типов variadic pack'a

Antervis
Antervis

Очень простой пример, демонстрирующий проблему: допустим, нам нужно что-то вроде функции, принимающей variadic pack int'ов:

void foo(int... args) {

Реализовать такую функцию можно двумя способами, через requires/концепты:

template <Same<int> ...Args>
void foo(Args... args) {

либо через static_cast:

void foo(auto ...args) {
    __foo_impl(static_cast<int>(args)...);
}

Первый вариант не поддерживает неявные преобразования, т.е. требует явно приводить типы передаваемых аргументов. Второй вариант отключает возможность перегружать foo другими variadic версиями.

 

Идея: ввести возможность ограничения списка типов, принимаемых variadic pack'ом:

void foo(auto ...(int) args) {

Функция будет участвовать в перегрузке если все её аргументы могут быть неявно приведены к одному из перечисленных в ограничителе типам. Например, так можно будет объявить функцию объединения строк с преаллокацией:

template <typename ...(std::string_view, Same<char>) Args>
auto join(Args args) {
// или
auto join(auto ...(std::string_view, Same<char>) args) {
// принимает типы, приводящиеся к string_view или удовлетворяющие концепту Same<char>

Также это позволит удобно реализовывать перегрузки variadic-pack функций

1
рейтинг
3 комментария
Andrey

http://wg21.link/p1219

Andrey
Antervis

Andrey, предлагаемое мной решение более универсальное

Antervis
Andrey

Antervis, я с первой попытки не понял, что именно Вы предлагаете, думал, что Вы хотите, чтобы в функцию парамерты приходили уже фиксированного типа. Но тогда это выражается как

void foo(ConvertibleTo<int> auto...);

и соответственно 

template<typename... Args>
  requires((ConvertibleTo<string_view> || Same<char>) && ...)
auto join(Args...);
Andrey
Обновлено 
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения