Сообщение Re: Шаблоны в с++ от 19.07.2022 20:01
Изменено 20.07.2022 8:26 rg45
Re: Шаблоны в с++
Здравствуйте, vasvladal, Вы писали:
Это шаблонный класс, предназначенный для хранения символов-разделителей — констант времени компиляции. В этом классе определен функциональный оператор, который используется для проверки, является ли тот или иной символ разделителем. Дополнительно в классе заданы ограничения на количество и состав символов — не меньше одного символа, и разделителем не может быть двойная кавычка и символы конца строки. Для всех проверок используются специальные выражения: fold expressions, которые позволяют без циклов, в рамках одного арифметического или булевого выражения, выполнить перебор всех констант, входящих в состав списка шаблонных параметров переменного размера — parameter packs
Использование может выглятеть примерно так:
http://coliru.stacked-crooked.com/a/61849a4f03987770
Примечательно, что такие выражения как is_delimiter(',') вычисляются во время компиляции. То есть, эти выражения можно использовать, например, в перечислениях, ключах оператора switch, для параметризации шаблонов и пр.
Это шаблонный класс, предназначенный для хранения символов-разделителей — констант времени компиляции. В этом классе определен функциональный оператор, который используется для проверки, является ли тот или иной символ разделителем. Дополнительно в классе заданы ограничения на количество и состав символов — не меньше одного символа, и разделителем не может быть двойная кавычка и символы конца строки. Для всех проверок используются специальные выражения: 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, для параметризации шаблонов и пр.
Re: Шаблоны в с++
Здравствуйте, vasvladal, Вы писали:
V>Здравствуйте! На гитхабе увидел такой шаблон.
V>...
V>Кто-нибудь может объяснить смысл ... в нем?
Это шаблонный класс, предназначенный для хранения символов-разделителей — констант времени компиляции. В этом классе определен функциональный оператор, который используется для проверки, является ли тот или иной символ разделителем. Дополнительно в классе заданы ограничения на количество и состав символов — не меньше одного символа, и разделителем не может быть двойная кавычка и символы конца строки. Для всех проверок используются специальные выражения: fold expressions, которые позволяют без циклов, в рамках одного арифметического или булевого выражения, выполнить перебор всех констант, входящих в состав списка шаблонных параметров переменного размера — parameter packs
Использование может выглятеть примерно так:
http://coliru.stacked-crooked.com/a/61849a4f03987770
Примечательно, что такие выражения как is_delimiter(',') вычисляются во время компиляции. То есть, эти выражения можно использовать, например, в перечислениях, ключах оператора switch, для параметризации шаблонов и пр.
V>Здравствуйте! На гитхабе увидел такой шаблон.
V>...
V>Кто-нибудь может объяснить смысл ... в нем?
Это шаблонный класс, предназначенный для хранения символов-разделителей — констант времени компиляции. В этом классе определен функциональный оператор, который используется для проверки, является ли тот или иной символ разделителем. Дополнительно в классе заданы ограничения на количество и состав символов — не меньше одного символа, и разделителем не может быть двойная кавычка и символы конца строки. Для всех проверок используются специальные выражения: 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, для параметризации шаблонов и пр.