Концепты: как добавить требование для const типа?

97
09 декабря 2021, 17:00

Пример:

template<typename T>
concept SequenceContainer = Container<T> && requires (T a)
{
    { a.front() } -> typename T::reference;
    /* requirements */
};

Здесь мы требуем, чтобы тип возвращаемого значения был неконстантной ссылкой. Но если a имеет тип const T - очевидно, правильно добавить дополнительное требование, указав, что "если a имеет тип const T, то вызов член-функции front() должен вернуть const_reference":

template<typename T>
concept SequenceContainer = Container<T> && requires (T a, const T b)
{
    { a.front() } -> typename T::reference;
    { b.front() } -> typename T::const_reference;
    /* requirements */
};

Вопрос: существует ли способ не указывать второй параметр - const T b, а каким-то образом сообщить, что в данном требовании тип a следует рассматривать как const T? Я не нашел ничего подходящего ни на en.cppreference.com, ни на eel.is.

Т.е., в идеале хотелось бы что-то вроде:

{ a.front() const } -> typename T::const_reference;

Если такого способа нет и нужно делать так, как описано выше (второй параметр с типом const) - при возможности поделитесь ссылкой на соответствующий пункт в стандарте (я про черновик, разумеется).

Answer 1

В голову приходит несколько вариантов:

  • std::as_const(a).front()

  • std::declval<const T &>().front()

READ ALSO
Qt - парсинг запроса на сервере в QTcpSocket

Qt - парсинг запроса на сервере в QTcpSocket

Есть сервер TCP QTcpServer tcp и сокет подключения QTcpSocket socketПодключаю я их вот так:

92
Вызов основного окна после авторизации с точки зрения MVVM паттерна C# WPF

Вызов основного окна после авторизации с точки зрения MVVM паттерна C# WPF

Подскажите пожалуйста, как вызывать после окна авторизации окно с основным функционалом(дочернее окно), при этом нужно использовать mvvm паттерн

212
Организация возвращаемых значений

Организация возвращаемых значений

Как решаются в проф программировании такие моменты ?

199