Здравствуйте, 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 этим же компилятором выдает ошибки, как и писал выше...