Code: Select all
#include
#include
#include
struct Input
{
int type;
int data;
};
template
struct TransformerFunctor
{
using variant = std::variant;
[[nodiscard]] /*static*/ constexpr variant operator()(Input const input) const noexcept
{
variant ret(std::in_place_type);
([&]
{
if(V::TYPE == input.type)
{
ret.template emplace(input.data);
}
}(), ...);
return ret;
}
};
struct VA;
struct VB;
struct VC;
using InputView = std::ranges::ref_view;
using TansformView = std::ranges::transform_view;
struct VA
{
static constexpr int TYPE = 1;
VA(int) noexcept;
};
struct VB
{
static constexpr int TYPE = 2;
VB(int) noexcept;
[[nodiscard]] TansformView get_sub_view() const;
};
struct VC
{
static constexpr int TYPE = 3;
VC(int) noexcept;
};
bool demo(std::span const inputs)
{
TansformView view(InputView(inputs), {});
for(std::variant const v : view)
{
if(std::holds_alternative(v))
{
return !std::ranges::empty(std::get(v).get_sub_view());
}
}
return false;
}
Interessanterweise scheint es, als würde Clang 20.1.0 diesen Code akzeptieren und ihn ohne Ausgabe kompilieren. GCC und MSVC hingegen erzeugen beide Kompilierfehler im Zusammenhang mit den VA-, VB- und VC -Typen, die unvollständige Typen sind. Oder soll das nicht funktionieren und einer der anderen ist richtig? Und in beiden Fällen kann ich dieses Problem einfach beheben?>