Como posso armazenar uma exibição composta de intervalos C++20 como um membro de classe?
Tentei com o seguinte código que funciona em geral, mas se eu colocar a estrutura em um cabeçalho, o GCC me avisa que splitter::view
tem ligação interna. (-Werror=subobject-linkage)
Acho que o GCC está certo neste caso, mas não sei como configurá-lo para vinculação externa.
Mas acho que tenho um problema mais fundamental aqui, que é que não consigo nomear o tipo de visualização de intervalo. Em teoria, eu poderia digitar isso, mas é um saco se eu adicionar outro filtro à visualização.
#include <ranges>
#include <string_view>
#include <fmt/core.h>
struct splitter {
static constexpr auto split = [](std::string_view command) {
return command
| std::views::split(' ')
| std::views::filter([](auto range) { return !std::ranges::empty(range); })
| std::views::transform([](auto range) { return std::string_view(range); });
};
using ViewType = decltype(split(std::declval<std::string_view>()));
ViewType view;
splitter(std::string_view str)
: view(split(str))
{
}
};
int main() {
std::string_view str = " test foo bar ";
splitter sptl(str);
for (auto s : sptl) {
fmt::print("token {} with size {}", s, s.size());
}
}
Aqui está um link do godbolt para a versão do cabeçalho: https://godbolt.org/z/avMhqofcf