Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > ger.ct > #617166

Metaprogrammierung (was: Re: Weißes Haus warnt vor C++)

From ram@zedat.fu-berlin.de (Stefan Ram)
Newsgroups ger.ct
Subject Metaprogrammierung (was: Re: Weißes Haus warnt vor C++)
Date 2024-03-07 11:06 +0000
Organization Stefan Ram
Message-ID <metaprogrammmierung-20240307120516@ram.dialup.fu-berlin.de> (permalink)
References (5 earlier) <l4o71fFbivgU1@mid.individual.net> <us90kt$10jn4$2@solani.org> <l4qqutFnrdkU1@mid.individual.net> <us9dd4$10eo0$1@solani.org> <l4r18kFooneU1@mid.individual.net>

Show all headers | View raw


Hermann Riemann <nospam.ng@hermann-riemann.de> schrieb oder zitierte:
>Das man mit Lisp automatisch Programme erstellen könnte,
>ging weit über ihr Denkvermögen hinaus.

  Man kann auch ein C-Programm schreiben,
  das automatisch C-Programme erstellt:

  main.c

#include <stdio.h>
#include <stdlib.h>
int main( void )
{ puts( "#include <stdio.h>" ); 
  puts( "" ); 
  puts( "int main( void )" ); 
  printf( "{ printf( %d ); }\n", rand() ); }

  transcript

#include <stdio.h>

int main( void )
{ printf( 41 ); }

  . (Das könnte man dann auch noch automatisch starten.)

  Etwas schwieriger ist es, so etwas praktisch so nutzbar zu machen,
  daß man bei komplizierteren Programmen noch die Übersicht behält.

  In C++ kann ein Programm durch Schablonen ("templates") Programmteile
  in etwas strukturierterer Weise generieren lassen. Dennoch ist die
  schablonenbasierte Metaprogrammierung für viele Programmierer recht
  unübersichtlich. Nun kann man heute in C++ viele solcher Anwendungen
  vereinfachen, indem man verlangen kann, daß bestimmte Programmteile
  bereits bei der Übersetzung ausgeführt werden, was auf recht über-
  sichtliche Weise möglich ist.

  C++ versteht Uhrzeiten normalerweise nicht in der Schreibweise
  "7_Std + 3_min". Das folgende C++-Programm erweitert die Programmier-
  sprache aber so, daß es diese Schreibweise versteht. Dabei erfolgt
  die gesamte Interpretation von "7_Std + 3_min" bereits /während der
  Übersetzung/ des Programms. (Das entspricht der Generierung eines
  anderen Programms, mit Ausführung dieser Operationen während der
  Generierung, wie "rand()" oben.) Gleichzeit ist der Quelltext aber
  übersichtlich, da normales C++ verwendet wird, nur mit "constexpr"
  angereichert.

  main.cpp

#include <cstdint>
#include <iostream>

struct time
{ double s;
  constexpr time( time && x )noexcept: 
  s{ static_cast< double >( x.s )} { }
  constexpr explicit time( ::std::uint64_t const s = 0 ): 
  s{ static_cast< double >( s ) } {}
  constexpr time & operator +=( const time & o )
  { s += o.s; return *this; }
  ::std::ostream & print( ::std::ostream & stream )const 
  { return stream << s << " s"; }};

constexpr inline time operator +( time result, time const & other )
{ result += other; return result; }

inline ::std::ostream& operator <<
( ::std::ostream & stream, time const & object )
{ return object.print( stream ); }

constexpr time operator "" _Std( ::std::uint64_t const v )
{ return time( v*( 60 * 60 )); }

constexpr time operator "" _min( ::std::uint64_t const v )
{ return time( v * 60 ); }

int main(){ ::std::cout << 7_Std + 3_min << '\n'; }

  transcript

25380 s

Back to ger.ct | Previous | Next | Find similar | Unroll thread


csiph-web