Forum: PC-Programmierung C++ Token-Suppe: Was macht dieses gebilde?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von What? (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1
template <typename=void> struct _ {};
2
3
auto l = [_=_<>{}](){};

Kann mir jemand erklaeren was das macht?

von Dr. Sommer (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Den Leser verwirren. Sonst absolut gar nichts.

von Carl D. (jcw2)


Bewertung
1 lesenswert
nicht lesenswert
Eine kleine Herausforderung an den Compiler, die validen C++14 Code 
darstellt und zu exakt 0 Maschinenbefehlen übersetzt wird.

von Wilhelm M. (wimalopaan)


Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Den Leser verwirren. Sonst absolut gar nichts.
1
template <typename=void> struct _ {};

Hier wird ein Klassentemplate mit dem Namen "_" definiert.
1
auto l = [_=_<>{}](){};

Hier wird l mit einer anonyme Funktion initialisiert, die durch die 
lambda-expression auf der rechten Seite des (ersten von links) "=" 
erzeugt wird.
In den [] ist das Capture: dort wird eine Instanz von "_" erzeugt und in 
das capture "_" kopiert. Die Parameterliste () der lambda-expression und 
der Körper {} sind leer.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Bewertung
1 lesenswert
nicht lesenswert
Wilhelm M. schrieb:

So ist es noch "schöner":
1
template <typename=void> struct _ {};
2
3
auto l = [_=_<>{}](){return _;}();

Frage: welchen Typ hat l?

: Bearbeitet durch User
von Tom (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Wenn man alles umbenennt, wird es einfacher:
1
template <typename=void>
2
struct MyStruct
3
{
4
    // empty
5
};
6
7
auto my_lambda = [ foo=MyStruct<>{} ](void)
8
{
9
    // do nothing with foo here
10
};

Dass der Name eines Templates ohne die <> noch im Namensraum zur 
Verfügung steht, war mir bisher nicht klar: vector<int> vector ist 
anscheinend völlig legal und wahrscheinlich der feuchte Traum der Fans 
der ungarischen Notation.

Wenn man den return type des lambda angibt, kann man noch ein paar 
verwirrende Zeichen mehr unterbringen:
1
auto l = [_=_<>{}]()->_<>{return _;}();

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> Wenn man den return type des lambda angibt, kann man noch ein paar
> verwirrende Zeichen mehr unterbringen:
>
1
> auto l = [_=_<>{}]()->_<>{return _;}();
2
>

Das werden die freu(n)dlosen dieser Sprache sicher wieder längere Zeit 
zitieren.

: Bearbeitet durch User
von T.roll (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Wenn wir schon bei Codefolter sind:
1
 #define _ F-->00||F-OO--;
2
 int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
3
 {
4
             _-_-_-_
5
        _-_-_-_-_-_-_-_-_
6
     _-_-_-_-_-_-_-_-_-_-_-_
7
   _-_-_-_-_-_-_-_-_-_-_-_-_-_
8
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
9
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
10
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
11
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
12
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
13
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
14
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
15
  _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
16
   _-_-_-_-_-_-_-_-_-_-_-_-_-_
17
     _-_-_-_-_-_-_-_-_-_-_-_
18
         _-_-_-_-_-_-_-_
19
             _-_-_-_
20
 }

https://de.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest
oder wie Wahnsinnigen von Perl:
https://de.wikipedia.org/wiki/Obfuscated_Perl_Contest

von Funkenflug (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Passend zum Nachbarthread:
Beitrag "Bios PW vergessen!"

Hier ein Code-Vorhängeschloss:
http://www.ioccc.org/2015/duble/prog.c

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Bewertung
0 lesenswert
nicht lesenswert
Wilhelm M. schrieb:
> Frage: welchen Typ hat l?

_<> (_<void>)

von Wilhelm M. (wimalopaan)


Bewertung
0 lesenswert
nicht lesenswert
Torsten R. schrieb:
> Wilhelm M. schrieb:
>> Frage: welchen Typ hat l?
>
> _<> (_<void>)

Leider kein Hauptgewinn ...

Wobei ich mir nicht sicher bin, was Du meinst, denn das, was Du 
geschrieben hast, ist kein Typ. Oder meintest Du _<> (*)(_<>), das wäre 
ein Funktionszeiger,
mit einem Parameter Typ _<> und Rückgabetyp _<>?

Und falls Du den Typ der lambda-expression meinst: den kann man nicht 
angeben.

Ok, der Typ von l ist: _<>

Auf der rechten Seite steht eine lambda-expression, die liefert ein 
Funktionsobjekt, das wird sofort aufgerufen, das liefert ein Objekt des 
Typs  _<> und damit wird l initialisiert und bekommt durch Typinferenz 
denselben Typ.

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Wilhelm M. schrieb:
> Torsten R. schrieb:
>> Wilhelm M. schrieb:
>>> Frage: welchen Typ hat l?
>>
>> _<> (_<void>)
>
> Leider kein Hauptgewinn ...
>
> Wobei ich mir nicht sicher bin, was Du meinst

Er meinte schon das Richtige. Das Klammerpaar gehört nicht zur
Typbezeichnung, sondern ist zu lesen als "oder alternativ". Also

  _<>

oder alternativ

  _<void>

Beides ist richtig.

Bei solchen Dingen lobe ich mir aber Haskell, wo man im interaktiven
Modus den Typ einer Variable einfach mit

  :t <Variablenname>

anzeigen lassen kann :)

von Wilhelm M. (wimalopaan)


Bewertung
-1 lesenswert
nicht lesenswert
Yalu X. schrieb:
> Wilhelm M. schrieb:
>> Torsten R. schrieb:
>>> Wilhelm M. schrieb:
>>>> Frage: welchen Typ hat l?
>>>
>>> _<> (_<void>)
>>
>> Leider kein Hauptgewinn ...
>>
>> Wobei ich mir nicht sicher bin, was Du meinst
>
> Er meinte schon das Richtige.

Gut, dass Du weißt, was andere Leute meinen ...

von Yalu X. (yalu) (Moderator)


Bewertung
1 lesenswert
nicht lesenswert
Wilhelm M. schrieb:
> Gut, dass Du weißt, was andere Leute meinen ...

Naja, das war in diesem Fall ja wirklich nicht schwer zu verstehen, vor
allem dann, wenn man die beiden Lösungen des Rätsels schon kennt. Man
kann sich natürlich auch alle Mühe geben, andere nicht zu verstehen :)

von Wilhelm M. (wimalopaan)


Bewertung
-1 lesenswert
nicht lesenswert
Yalu X. schrieb:
> Wilhelm M. schrieb:
>> Gut, dass Du weißt, was andere Leute meinen ...
>
> Naja, das war in diesem Fall ja wirklich nicht schwer zu verstehen, vor
> allem dann, wenn man die beiden Lösungen des Rätsels schon kennt.

Zwei Lösungen für ein Rätsel?

> Man
> kann sich natürlich auch alle Mühe geben, andere nicht zu verstehen :)

Das war nicht meine Intention: aber so wie er das oben geschrieben hat, 
kann man m.E. nicht erkennen, dass das eine Alternative sein sollte. Vor 
allem habe ich ja auch geschrieben, wie ich das interpretiert habe ...

von Johann L. (gjlayde) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Wilhelm M. schrieb:
1
> auto l = [_=_<>{}](){return _;}();
>
> Frage: welchen Typ hat l?

auto :-)

von Wilhelm M. (wimalopaan)


Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> Wilhelm M. schrieb:
>
1
>> auto l = [_=_<>{}](){return _;}();
>>
>> Frage: welchen Typ hat l?
>
> auto :-)

brumm brumm

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Bewertung
0 lesenswert
nicht lesenswert
Wilhelm M. schrieb:
> Torsten R. schrieb:
>> Wilhelm M. schrieb:
>>> Frage: welchen Typ hat l?
>>
>> _<> (_<void>)
>
> Leider kein Hauptgewinn ...

_<> bzw. _<void>

Besser?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.