Templates mit Ausschlüssen- geht das?

combie:
static_assert(not is_unsigned(), "Error, kein gültiger Indextyp");

Doch - unsigned ist ja gerade der gültige Indextyp. Float, int usw. wären ungültig.
also static_assert meckert, wenn es nicht erfüllt ist? Dann hatte ich das falsch verstanden.

Gruß Tommy

Doch
...
also static_assert meckert, wenn es nicht erfüllt ist?

Ja, es prüft auf Einhaltung der Bedingung.

static_assert(is_floating_point<T>(), "Fliesskomma Type erwartet");
static_assert(is_integral<T>(), "Ganzzahliger Type erwartet");
static_assert(is_signed<T>(), "Ganzzahliger Type, mit Vorzeichen, erwartet");
static_assert(is_unsigned<T>(), "Ganzzahliger Type, ohne Vorzeichen, erwartet");
static_assert(is_same<U,V>(), "Templateparameter U und V muessen den gleichen Type haben");

Ok, das hatte sich bei mir falsch eingeprägt.
Das sind die Korrekturen, die man sich dann merkt.

Gruß Tommy

Im Rahmen der Type Traits bin ich auf ein Problem gestoßen, welches mir noch nicht so richtig schmeckt.....

Hier ist noch alles ok.

template<typename T> struct is_integral   :bool_type<is_unsigned<T>()||is_signed<T>()>{};

Es dreht sich hier um diesen Ausdruck:
:bool_type<is_unsigned()||is_signed()>

Jetzt zum Problem:

template<typename T> struct is_void    :bool_type<is_same<T,void>()> {};

Wirft die Meldung:

typetrait005:28:65: error: type/value mismatch at argument 1 in template parameter list for 'template<bool b> struct bool_type'
   28 | template<typename T> struct is_void    :bool_type<is_same<T,void>()> {};
      |                                                                 ^
E:\Programme\arduino\portable\sketchbook\typetrait005\typetrait005.ino:28:65: note:   expected a constant of type 'bool', got 'is_same<T, void>()'
exit status 1
type/value mismatch at argument 1 in template parameter list for 'template<bool b> struct bool_type'

Hier steckt das Problem:
:bool_type<is_same<T,void>()> {};

Dieses funktioniert:
:bool_type<true ||is_same<T,void>()> {};

Und auch:
:bool_type<(is_same<T,void>())> {};

Irgendwie schmeckt mir das nicht.....

Hallo,

:bool_type < true || is_same <T,void>() > {};

:bool_type < (is_same <T,void>() )> {};

Laut meiner Meinung muss beides gleich funktionieren. true ist konstant und kann bei ODER "rausgekürzt" werden.

Was anderes wäre es mit UND Verknüpfung.

Edit:
muss mich korrigieren, (true || irgendwas) ist immer true

Wenn ich das richtig verstehe ist das Komische dass eine Klammer um den Ausdruck erwartet wird. Da scheint der Parser ein Problem zu haben

Edit:
muss mich korrigieren, (true || irgendwas) ist immer true

Sorry, mein Fehler.
:bool_type < true && is_same <T,void>() > {};
ist gemeint.
Aber das tut der Erscheinung keinen Abbruch, ob || oder &&

Wenn ich das richtig verstehe ist das Komische dass eine Klammer um den Ausdruck erwartet wird.

Ja.
Entweder Klammer oder eine logische Verknüpfung.
Ist irgenwie seltsam...

Wobei

true || is_same...

immer true ist und das dürfte nicht das gewünschte Resultat sein.

Gruß Tommy

immer true ist und das dürfte nicht das gewünschte Resultat sein.

Das stimmt, das war ein logischer Fehler.
Da gehört ein && hin
Hat aber mit meiner eigentlichen Sorge nichts zu tun.

Die besteht weiter.

Hallo,

aber mit Klammer und UND muss sich das zwangsweise gleich verhalten. Deswegen kann man true && auch weglassen.

:bool_type < true && (is_same <T,void>() ) > {};

:bool_type < (is_same <T,void>() )> {};

Ansonsten müßtest du deine Sorge näher erläutern.

:bool_type < true && is_same <T,void>() > {};  // funktoniert
:bool_type < true && (is_same <T,void>() ) > {}; // funktoniert
:bool_type < (is_same <T,void>() )> {};  // funktoniert
:bool_type < is_same <T,void>() > {};   // versagt mit Meldung

Dann kriegt der Kompiler das ohne Klammer (das && wirkt ja auch wie eine Klammer) nicht gebacken.
Bug or feature?

Gruß Tommy

Hallo,

aha, ich sag mal salopp ist wie bei Formeln, manchmal ist eine zusätzliche Klammer notwendig. :slight_smile:

Bug or feature?

Ja, das ist die Frage....

Bisher sehe ich keinen Grund, warum die Klammer nötig ist.

Inhaltlich wohl nicht aber wenn es den Kompeiler besser gefällt, ...
Das muss man zwar nicht begreifen aber man kann damit leben.

Mal sehen, was die Version 21 sagt.

Gruß Tommy