Ist es möglich, STD :: Ranges :: Transform_View mit unvollständigen Typen zu verwenden?C++

Programme in C++. Entwicklerforum
Anonymous
 Ist es möglich, STD :: Ranges :: Transform_View mit unvollständigen Typen zu verwenden?

Post by Anonymous »

Ich schreibe ein C ++ 23 -Programm und versuche, eine rekursive Datenstruktur mit Hilfe von std :: ranges :: transform_view zu erstellen. Es scheint jedoch, dass die Erfordernis Klauseln auf den STD :: Ranges :: Transform_View Vorlage dazu führen, dass vollständige Klassentypen zu früh erforderlich sind, sodass es unmöglich ist, die Reursion zu haben. Ich habe dies bereits mit anderen Mitteln, aber es wäre schön, die Ranges-Bibliothek zu verwenden, um dies zu vereinfachen.

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;
}
Compiler Explorer-Link: https://compiler-explorer.com/z/4x487erve
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?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post