Re[2]: Шаблоны в с++
От: vasvladal  
Дата: 21.07.22 10:48
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, vasvladal, Вы писали:


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

V>>...
V>>Кто-нибудь может объяснить смысл ... в нем?

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


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


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


R>
R>#include <iostream>

R>using char_t = char;

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

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

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

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


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


Cпасибо большое за развернутый ответ! В VS-2019 все собирается отлично, в Qt c этим же компилятором выдает ошибки, как и писал выше...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.