Hilfe für Klausur...
-
groovemaster schrieb:
;oder
if (false) ;oder
while (false) ;oder
...
oder
einfach 'ne Anweisung die nix macht.Nein, Leeranweisungen sind nur solche, die wirklich leer sind. Also ein einsames Semikolon. if (false); ist eine if-Anweisung.
Einfach gesagt, in eine Header-Datei kommt der Code, der nicht in die Übersetzungseinheit kommt.
Nein, der Inhalt der Headerdatei ist Teil der Übersetzungseinheit.
-
scrub schrieb:
in einen header kommt gar kein code. das is ne schnittstellenvereinbarung, üblicherweise deklarationen.
Das ist auch Code.
-
ja ne, is klar.
nur halt kein ... *hark* wie soll ichs sagen.. kein code, der irgendwas sinnvolles macht.
ich mein, int foo(int a); ist natürlich code, aber daraus kann man kein programm machen. weil das dingenskirschens, was daraus ein programm machen soll, gar nicht weiß, was foo eigentlich macht.
das meinte ich. klar, compilieren kann man damit. aber es ist doch nur ne deklaration.
-
scrub schrieb:
nur halt kein ... *hark* wie soll ichs sagen.. kein code, der irgendwas sinnvolles macht.
template <bool> struct CTAssert; template <> struct CTAssert<true> {};Das ist doch durchaus sinnvoll ...

-
fubar schrieb:
template <bool> struct CTAssert; template <> struct CTAssert<true> {};Das ist doch durchaus sinnvoll ...

aber durchaus noch verbesserungswürdig :p
-
sagen wirs mal so... ich hab nicht wirklich ne ahnung, welche götter du mit deiner runenkombination da oben herbeirufen willst. außerdem ist mir dieses mixgetränk echt zu exotisch..
will sagen: wtf ist das?!?
außerdem ist ne unterteilung in code und nichtcode unsinnig, wie wir grade festgestellt haben, jedenfalls wenns um header geht.
ich präzisiere: in header kommen nur schnittstellen.
-
scrub schrieb:
ich präzisiere: in header kommen nur schnittstellen.
Und Inline-Funktionen. Und Templates. (Und Makros.)
Ich präzisiere:
In Header kommt alles, was in mehreren Übersetzungseinheiten (tokenweise) identisch enthalten sein darf, ohne die One-Definition-Rule zu verletzen
-
will sagen: wtf ist das?!?
ein compile time assert. Funktioniert wie ein normales assert, mit dem einzigen unterschied, dass es schon zur compilezeit prüfen kann(zb, ob template parameter gültig sind)
-
hm... was hat das mit den inlinefunktionen auf sich? das sind doch auch funktionen, die man deklarieren kann, und damit gehören ihre schnittstellen natürlich ebenfalls in den header. sag ich doch...
ka was templates sein sollen... soweit ich weiß parametrisierte klassen, quasi eine art "objekt"makro. kein plan, werd ich wahrscheinlich auch nie brauchen *g*
makros... makros gehören dahin, wo der pfeffer wächst, aber sonst nirgendwohin. irgendwo stand mal geschrieben, daß sich makros durch inlinefunktionen ersetzen lassen. und symbolische konstanten durch echte konstanten.
fazit: im westen nix neues.
@otze: ne, nicht konkret, sondern überhaupt. ich weiß natürlich konkret auch nicht, was ein assert sein soll (vermutlich abkürzung für "assertation", dessen deutsche bedeutung mir unbekannt ist). aber ich erkenn ja nicht mal die schreibweise.

-
ka was templates sein sollen... soweit ich weiß parametrisierte klassen, quasi eine art "objekt"makro. kein plan, werd ich wahrscheinlich auch nie brauchen *g*
das dachte ich auch mal
. ohne templates verschenkt man zuviel. Achja, jedes mal, wenn du einen container der stl benutzt, benutzt du templates 
-
zu deiner info: meine programme bewegen sich im bereich von <1000 zeilen. deutlich <1000. ich hab auch noch die was vererbt oder so. das scheinen alles dinge zu sein, die man erst bei wahnsinnig volumiösen programmen braucht die wahnsinnig tolle dinge machen sollen.
in anbetracht der notwendigkeiten in der näheren zukunft (programmierschein) scheint es mir auch sehr überspannt, sich sowas aneignen zu wollen. auf den punkt gebracht: im moment brauch ichs garantiert nicht, später lernen geht immer, und so schwer kanns ja eigentlich nicht sein.was sind templates denn nun?
-
scrub schrieb:
hm... was hat das mit den inlinefunktionen auf sich? das sind doch auch funktionen, die man deklarieren kann, und damit gehören ihre schnittstellen natürlich ebenfalls in den header. sag ich doch...
Ich rede aber nicht von ihren Deklarationen, sondern von ihren Definitionen. Für deinen Grad von Ahnung diskutierst du mit ziemlich viel Elan, das muss man dir lassen. Ich hoffe, das ist bei deinen politischen Diskussionsbeiträgen nicht auch so.
fazit: im westen nix neues.
Nur wenn man das Neue nicht sehen will.
-
otze schrieb:
aber durchaus noch verbesserungswürdig :p
Was willst du denn noch verbessern? Eine Implementierung für false hinzufügen?

Sollte ja auch nur ein kurzes Bsp. sein ...@scrub:
Hier eine kleine Einführung: http://home.earthlink.net/~joshwalker1/writing/TemplateMetaprogramming.html
-
scrub schrieb:
was sind templates denn nun?
Das sind Klassen/Funktionen/.../wasauchimmerParametererwartet
Anstatt zu schreiben:Foo(int) Foo(double //...->Man will das für alle Datentypen schreiben (Auch benutzergenerierte) -> Man benutzt dann einen Symbolischen Datentyp (meist T,U,V,...) So z.B.:
template<class /*typename ginge auch*/ T> //Was für Parameter will ich überhaupt Foo(T t) { //tue was auch immer nötig ist };Achja: Die Funktionen weden vom kompiler automatisch erzeugt, wenn sie benötigt werden...
-
mithilfe von templates erstellt dir der compiler mehrere Versionen einer Klasse, zb wenn du eine Klasse haben willst, die für int,long,double,float und bool funktioniert, musst du nicht für jede version eine eigene Klasse schreiben, sondern benutzt eine template klasse.
ich erklärs mal am vector:
template<class T,...> class vector{...}; //in der main vector<int> a;//nimmt jetzt int an vector<float> b;//nimmt jetzt float an vector<vector<int> > c;//nimmt jetzt vector<int> antemplates ersparen dir a) viel schreibarbeit, und b) sind damit einige fortgeschrittene Techniken möglich(wie der compile time assert), die den programmcode dazu bringen können, hochoptimierten code zu erzeugen.
-
Bashar schrieb:
Nein, Leeranweisungen sind nur solche, die wirklich leer sind. Also ein einsames Semikolon. if (false); ist eine if-Anweisung.
Sollten ja auch nur Beispiele sein. Ich hoffe du willst nicht bestreiten, dass die Sub-Anweisungen trotzdem Leeranweisungen sind.
Bashar schrieb:
Nein, der Inhalt der Headerdatei ist Teil der Übersetzungseinheit.
Wieso einige Leute immer so penibel sein müssen. Da hab ich wohl den Smiley vergessen. Ich wollte damit eigentlich nur sagen, alles was nicht wahr ist, ist falsch.

scrub schrieb:
ja ne, is klar.
nur halt kein ... *hark* wie soll ichs sagen.. kein code, der irgendwas sinnvolles macht.
ich mein, int foo(int a); ist natürlich code, aber daraus kann man kein programm machen. weil das dingenskirschens, was daraus ein programm machen soll, gar nicht weiß, was foo eigentlich macht.Interpretiere nicht in anderer Leute's Aussagen deine Sichtweise.

scrub schrieb:
ka was templates sein sollen... soweit ich weiß parametrisierte klassen, quasi eine art "objekt"makro. kein plan, werd ich wahrscheinlich auch nie brauchen *g*
Schade für dich. Templates sind ua ein Grund, warum ich kein C, sondern nur noch C++ programmiere.
scrub schrieb:
makros... makros gehören dahin, wo der pfeffer wächst, aber sonst nirgendwohin.
Oder du benutzt sie sinnvoll, zB um portablen Code zu schreiben.
-
Wie wird dieses CTAssert, denn eingesetzt? Also dass es nur _keinen_ Fehler gibt, wenn das ganze auch true ist, ist klar, aber wie verwende ich das nacher im Code?
-
SirLant schrieb:
Wie wird dieses CTAssert, denn eingesetzt? Also dass es nur _keinen_ Fehler gibt, wenn das ganze auch true ist, ist klar, aber wie verwende ich das nacher im Code?
normalerweise kommt da en macro rum, welches das ganze in ne typedef/enum packt...
ein beispiel:
class Base{}; class Derived:public Base{}; class UnDerived{}; template<class T> class Test{ typedef CTAssert<IsDerived<T,Base>::Result> ASSERTER;//je nach compiler muss das ne enum sein,bei manchen reicht ne typedef, bei manchen leider nicht... //rest der Klasse... }; //in der main Test<Derived> a;//funzt Test<UnDerived> b;//fehler, nicht von Base abgeleitetIsDerived stell ich hier mal nicht vor^^
-
Coole Sache, hab wieder was gelernt

-
Vielleicht sollte man im diesem Zusammenhang noch boost::static_assert erwähnen:

http://www.boost.org/libs/static_assert/static_assert.htm