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

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

Изменено 19.07.2022 20:27 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, Вы писали:

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

Использование может выглятеть примерно так:

http://coliru.stacked-crooked.com/a/61849a4f03987770

#include <iostream>

using char_t = char;

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

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

constexpr Delimiter<'.', ',', ';'> is_delimiter;

int main()
{
    std::cout << std::boolalpha;
    std::cout << is_delimiter('a') << std::endl; // false
    std::cout << is_delimiter('7') << std::endl; // false
    std::cout << is_delimiter(',') << std::endl; // true
    std::cout << is_delimiter(';') << std::endl; // true
}


Примечательно, что такие выражения как is_delimiter(',') вычисляются во время компиляции. То есть, эти выражения можно использовать, например, в перечислениях, ключах оператора switch, для параметризации шаблонов и пр.