Информация об изменениях

Сообщение Re: Шаблоны в с++ от 19.07.2022 20:01

Изменено 19.07.2022 20:03 rg45

Re: Шаблоны в с++
Здравствуйте, vasvladal, Вы писали:

V>Здравствуйте! На гитхабе увидел такой шаблон.

V>
V>template<char_t... delimiters>
V>    struct Delimiter
V>    {
V>        static_assert(sizeof...(delimiters) >= 1, "at least one delimiter required");
V>                static_assert(((delimiters != '"') && ...), "the reserved character \" may not be a delimitor");
V>                static_assert(((delimiters != '\r') && ...), "newlines may not be a delimitor");
V>                static_assert(((delimiters != '\n') && ...), "newlines may not be a delimitor");

V>        constexpr bool operator()(char_t candidate) const noexcept
V>        {
V>            return ((candidate == delimiters) || ...);
V>        }
V>    };
V>

V>Кто-нибудь может объяснить смысл ... в нем?
V>(ISO C++17 Standard (/std:c++17))
V>Спасибо

Это шаблонный класс, предназначенный для хранения символов-разделителей — констант времени компиляции. В этом классе определен функциональный оператор, который используется для проверки, является ли тот или иной символ разделителем. Дополнительно в классе заданы ограничения на количество и состав символов — не меньше одного символа, и разделителем не может быть двойная кавычка и символы конца строки. Для всех проверок используются специальные выражения: fold expressions, которые позволяют без циклов выполнить перебор всех констант, входящих в состав списка шаблонных параметров переменного размера — parameter packs
Re: Шаблоны в с++
Здравствуйте, vasvladal, Вы писали:

V>Здравствуйте! На гитхабе увидел такой шаблон.

V>
V>template<char_t... delimiters>
V>    struct Delimiter
V>    {
V>        static_assert(sizeof...(delimiters) >= 1, "at least one delimiter required");
V>                static_assert(((delimiters != '"') && ...), "the reserved character \" may not be a delimitor");
V>                static_assert(((delimiters != '\r') && ...), "newlines may not be a delimitor");
V>                static_assert(((delimiters != '\n') && ...), "newlines may not be a delimitor");

V>        constexpr bool operator()(char_t candidate) const noexcept
V>        {
V>            return ((candidate == delimiters) || ...);
V>        }
V>    };
V>

V>Кто-нибудь может объяснить смысл ... в нем?
V>(ISO C++17 Standard (/std:c++17))
V>Спасибо

Это шаблонный класс, предназначенный для хранения символов-разделителей — констант времени компиляции. В этом классе определен функциональный оператор, который используется для проверки, является ли тот или иной символ разделителем. Дополнительно в классе заданы ограничения на количество и состав символов — не меньше одного символа, и разделителем не может быть двойная кавычка и символы конца строки. Для всех проверок используются специальные выражения: fold expressions, которые позволяют без циклов, в рамках одного арифметического или булевого выражения, выполнить перебор всех констант, входящих в состав списка шаблонных параметров переменного размера — parameter packs