Существует способ собрать такой диапазон из разрозненных частей, но вы не можете неявно рассматривать T*
как единое целое.
Все, что вам нужно сделать, это построить subrange
из указателя, используя unreachable_sentinel_t
в качестве дозорного типа. Таким образом, вы можете закодировать такую функцию как:
template<typename T>
auto inf_ptr_range(T *ptr)
{
return std::ranges::subrange(ptr, std::unreachable_sentinel_t{});
}
И вы можете использовать это в своем коде :
const char* foo[] = {"This", "is", nullptr, "great"};
for (auto e : ::std::ranges::take_while_view (
inf_ptr_range(foo),
([](const char* s){return s!=nullptr;})))
std::cout << e << "\n";
Или используя нотацию в стиле представления:
int main()
{
const char* foo[] = {"This", "is", nullptr, "great"};
for (auto e : inf_ptr_range(foo) | std::views::take_while(
[](const char* s){return s!=nullptr;}))
std::cout << e << "\n";
}