Лить контейнер с полученным в контейнер с базойC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Лить контейнер с полученным в контейнер с базой

Сообщение Anonymous »

У нас есть классы A и B, которые выглядят как < /p>

Код: Выделить всё

struct A {
int x;
auto display() const noexcept -> void { /* displaying */ }
};

struct B final : A {
/* no added members */
auto foo() const noexcept -> void { ... }
};
< /code>
с функцией < /p>
auto display_all_as(std::span as) noexcept -> void {
for (auto const a : as)
a.display()
}
< /code>
Мы можем назвать эту функцию как < /p>
auto constexpr a_arr = std::array{};
display_all_as(a_arr);
< /code>
Но если мы попытаемся назвать это следующим образом, это не работает < /p>
auto constexpr b_arr = std::array{};
display_all_as(b_arr); // error: no known conversion from array to array
< /code>
Я получил код для работы, изменив функцию на < /p>
template 
requires std::ranges::range and std::is_convertible_v
auto constexpr display_all_as(T as) noexcept -> void {
for (auto const a : as)
a.display();
}
после просмотра [[https://stackoverflow.com/questions/644 ... oncepting=, но, очевидно, требуется, чтобы Тип контейнера реализует value_type, что может быть не так, если вы используете пользовательские контейнеры.
Дополнительно посмотрите на вывод сборки из Clang ++ main.cpp -std = c ++ 20 -o3 -s < /code> ( С Clang ++ версией 19.1.7) он генерирует две якобы идентичные функции, одна специализируясь на , а другая специализируется на b .
Я пытаюсь иметь такой же/аналогичный API , но я хотел бы более оптимизированный и общий путь, то есть не было двух частей сборки. , потому что это приведет к проблемам сплайсинга объекта, но в этом случае b не добавляет никаких участников в , поэтому кажется, что мы должны иметь возможность преобразовать массив -> массив .


Подробнее здесь: https://stackoverflow.com/questions/794 ... er-of-base
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»