[C++] concept, das die Anzahl Member eines Types testet

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 4858
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

[C++] concept, das die Anzahl Member eines Types testet

Beitrag von Schrompf »

Hi,

ich weiß nicht, ob das überhaupt möglich ist: ich möchte per concept die Anzahl Member eines Types testen. Also sowas hier in Kurzform:

Code: Alles auswählen

template <typename T> concept Has2Members = requires(T t) { auto [a,b] = t; };

void PrintIt(Has2Members const auto& v) { 
  const auto& [a, b] = v;
  std::cout << a << ", " << b << std::endl;
}
Das ist quasi ne Poor Man's Reflection. Und nun grübel ich, ob das überhaupt geht, und falls ja wie? Der Compiler meckert bisher über das auto im concept und ich habe noch keine Syntax-Variante gefunden, die er akzeptieren würde.

Live ausprobieren hier: https://godbolt.org/z/MxrbjsY9n
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: [C++] concept, das die Anzahl Member eines Types testet

Beitrag von Matthias Gubisch »

Ich bin vor einiger Zeit mal hierrueber gefallen:
https://towardsdev.com/counting-the-num ... 1aecfd725c

https://towardsdev.com/counting-the-num ... 103dec734f

Wenn ich den Artikel und deine Frage richtig verstehe ist das was du vorhast kein Triviales Problem....

Edit:
nach ein wenig googlen (weil mich das problem gerade interessiert) bin ich auf das hier gestossen:

https://godbolt.org/z/z1Pv8f1fW

Kann aber nicht sagen ob das in allen faellen klappt, aber scheint sehr elegant zu sein
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] concept, das die Anzahl Member eines Types testet

Beitrag von dot »

Schrompf hat geschrieben: 19.09.2023, 13:53 ich weiß nicht, ob das überhaupt möglich ist: ich möchte per concept die Anzahl Member eines Types testen.
Im Allgemeinen ist das nicht möglich. Für bestimmte Typen kann man z.B. rumprobieren wie viele Initializer man reinbekommt, aber das sind alles Hacks die nur unter bestimmten Voraussetzungen funktionieren und bei weitläufiger Anwendung vermutlich schnell mal auf die Buildtime drücken…
Benutzeravatar
Schrompf
Moderator
Beiträge: 4858
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [C++] concept, das die Anzahl Member eines Types testet

Beitrag von Schrompf »

Ja, ist alles hacky, ist mir bewusst. Der Trick mit der Anzahl Konstruktor-Args ist aber sehr elegant, die Versionen davon auf StackOverflow sind sehr viel komplizierter. Und da ich nur jede Menge kleiner geschachtelter Strukts ohne Ctor habe, wäre der für mich prima geeignet. Danke!

Es gibt alternativ auch nen Trick, das auto [a, b] = t; in einen Lambda zu verschieben. Lambdas sind seit C++20 nämlich primary expressions und demzufolge darf man sie jetzt in nem concept einsetzen. Allerdings hat der GCC dazu einen (bekannten) Bug, selbst der neueste, so dass diese Option bei uns ausfällt.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] concept, das die Anzahl Member eines Types testet

Beitrag von dot »

Schrompf hat geschrieben: 19.09.2023, 21:09 Es gibt alternativ auch nen Trick, das auto [a, b] = t; in einen Lambda zu verschieben. Lambdas sind seit C++20 nämlich primary expressions und demzufolge darf man sie jetzt in nem concept einsetzen. Allerdings hat der GCC dazu einen (bekannten) Bug, selbst der neueste, so dass diese Option bei uns ausfällt.
Lambdas waren immer schon primary expressions. Was C++20 neu eingeführt hat, war, dass man Lambdas nun in unevaluated contexts verwenden kann. Meinem Verständnis nach ist der Body eines Lambdas in einem unevaluated context aber selbst kein unevaluated context, d.h. das sollte nicht funktionieren. Hast du vielleicht einen Link zu diesem GCC Bug?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4858
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [C++] concept, das die Anzahl Member eines Types testet

Beitrag von Schrompf »

Grmpf, finde es gerade nicht mehr wieder. Sorry. Ich hatte das nur aus diversen StackOverflow-Antworten aufgeschnappt und ein Kollege hatte mein Godbolt modifiziert und das auto[] in Lambdas verpackt, was auf Clang dann kompilierte und auf GCC nicht. Aber ich finde es gerade nicht wieder.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten