Элегантная инициализация std::array с конструируемым типом, отличным от умолчанию.
Инициализация std::array с нестандартным Тип конструктивного элемента может оказаться обременительной задачей. Повторение значения n раз вручную неэффективно и подвержено ошибкам при большом n.
Для решения этой проблемы существует более элегантный подход, заключающийся в использовании типа последовательности и генератора. Основная идея — создать последовательность индексов от 0 до n-1, а затем использовать функцию для многократного применения значения к каждому индексу.
Вот реализация:
template
auto repeat(T value, seq) -> std::array
{
// Unpack N, repeating `value` sizeof...(N) times
// Note that (X, value) evaluates to value
return {(N, value)...};
}
Чтобы инициализировать std::array с использованием этого подхода:
template
void f(T value)
{
// genseq_t is seq
std::array items = repeat(value, genseq_t{});
}
Кроме того, используются следующие определения:
template
struct seq
{
using type = seq;
static const std::size_t size = sizeof ... (N);
template
struct push_back : seq {};
};
template
struct genseq : genseq::type::template push_back {};
template
struct genseq : seq {};
template
using genseq_t = typename genseq::type;
Это решение обеспечивает эффективный и элегантный способ инициализации std::array с типами, не создаваемыми по умолчанию, независимо от значения n.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3