Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| 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> |
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