Как Concepts-Lite будет взаимодействовать с различными шаблонами?

Я смотрел выступление Бьярна Струструпа в Going Native 2013 и он приводит следующий пример для новой функции C ++ для облегчения понятий.

void sort(Container& c); // terse notation

// Expands to
template <Container __Cont>
void sort(__Cont& c); // shorthand notation

// Expands to
template <typename __Cont>
requires Container<__Cont>()
void sort(__Cont & c);

У меня вопрос, как это будет работать с шаблонами с переменным числом аргументов?

Скажем, я хочу определить вариант maximum функция с использованием Comparable концепция. Будет ли принят следующий синтаксис?

auto maximum(Comparable a)
{
return a;
}

auto maximum(Comparable c, Comparable... rest)
{
return std::max(a, maximum(rest...));
}

Если так будет Comparable... означает, что все элементы в пакете параметров имеют одинаковый тип или просто все они Comparable типы, так что пакет может включать в себя как int а также string? (которые оба сопоставимы, но не друг с другом)

Любопытные умы хотят знать.

11

Решение

Я считаю, что цель краткого формата состоит в том, чтобы все элементы в пакете были одного типа. Это получено из примера в п. 5.3.3 п3701, в котором говорится, что

void sort(Random_access_iterator p, Random_access_iterator q);

должно быть эквивалентно

template<Random_access_iterator __Ran>
void sort(__Ran p, __Ran q);

так как

«По умолчанию, если вы используете тот же ограниченный параметр
введите имя для двух аргументов, типы этих аргументов должны быть одинаковыми.
Мы решили сделать повторное использование ограниченного имени типа параметра подразумевают
«Тот же тип», потому что это (в большинстве сред) является наиболее распространенным случаем,
было бы странно иметь идентификатор, используемый дважды в области видимости, иметь два разных
значения, и цель здесь состоит в том, чтобы оптимизировать для краткого обозначения простейшего случая «.

Но я не понимаю, как это может быть расширен в ваш maximum с текущим (’14) синтаксисом шаблона. В предлагаемом изменении стандартной формулировки в n3701 речь шла только о простом случае

§7.1.6.5 Спецификаторы ограниченного типа [dcl.spec.constrained]

Первое использование Концепция имя или же Концепция частичной Идентификатор в рамках связывает это
имя для типа заполнителя, так что последующие использования того же имени относятся к
того же типа.

Но это не объясняет взаимодействие вариадиков. Возможно, нужно подождать 3-й ревизии, чтобы уточнить это.

7

Другие решения

Я не знаю, если N3580 это последняя версия концептуального документа, но в 4.5.1, похоже, описывается, как требования к типу могут использоваться с списками аргументов с переменным числом аргументов. Кажется, что

template <Comparable... T>
auto maximum(T... values) -> <return-type-goes-here>

потребует, чтобы каждый из аргументов удовлетворял Comparable требование, но нет никаких ограничений, что типы T... все одинаковые. Это требование должно быть наложено отдельно. На самом деле, единственный способ узнать, как навязать такое же требование к типу, — это тот же подход, что и в C ++ 11, но у концептуальных средств может быть лучший подход.

6