Код: Выделить всё
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();
}
Дополнительно посмотрите на вывод сборки из Clang ++ main.cpp -std = c ++ 20 -o3 -s < /code> ( С Clang ++ версией 19.1.7) он генерирует две якобы идентичные функции, одна специализируясь на , а другая специализируется на b .
Я пытаюсь иметь такой же/аналогичный API , но я хотел бы более оптимизированный и общий путь, то есть не было двух частей сборки. , потому что это приведет к проблемам сплайсинга объекта, но в этом случае b не добавляет никаких участников в , поэтому кажется, что мы должны иметь возможность преобразовать массив -> массив .
Подробнее здесь: https://stackoverflow.com/questions/794 ... er-of-base
Мобильная версия