Anti-Jammer-Thread

Hier kann über allgemeine Themen diskutiert werden, die sonst in kein Forum passen.
Insbesondere über Szene, Games, Kultur, Weltgeschehen, Persönliches, Recht, Hard- und Software.
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von Krishty »

error C1071: unexpected end of file found in comment

für die letzte angefangene Header-Zeile

} // namespace Foo

Der Kommentar sollte zuende sein, weil VC am Ende einen Zeilenumbruch hätte einfügen müssen, und dann käme das nun erwartete Dateiende. (Nachtrag: Ohne Spracherweiterungen!)
Zuletzt geändert von Krishty am 24.03.2013, 00:23, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von dot »

Jo, die Sache von wegen Newline wurde offenbar erst mit C++11 eingebaut, davor fügt der Compiler offenbar kein Newline ein. g++ spuckte mir diesbezüglich iirc immer eine Warning aus...
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von Krishty »

Oh; dann ist es schlicht noch nicht implementiert. Danke!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von dot »

Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von Krishty »

CodingCat hat geschrieben:AMDs CodeXL ist nicht nur das gute alte CodeAnalyst in wunderbare Visual-Studio-Integration gegossen (auch VS11!), …
Bei VS11 wird bei mir absolut garnichts integriert. Dafür habe ich eben VS10 gestartet und war verblüfft, dort plötzlich einen CodeXL Explorer zu haben … oder braucht man dafür eine besondere Edition?
Ja; das ist mir alles bekannt. Ich würde sogar noch hinzufügen, dass es ganz schlicht das Parsen vereinfacht. (Ich habe mal irgendeinen Linuxer sagen hören, dass eine leere Datei per Definition keine Textdatei ist, weil eine Textdatei aus Zeilen besteht, und jede Zeile endet mit einem Zeilenumbruch. Typischer Fall von Mensch muss sich dem Computer anpassen statt umgekehrt, igitt.)

Dass die Warnung für C++ vor 2011 implementiert war, leuchtet mir also völlig ein; und ich begrüße, dass das Ganze durch den neuen Standard überarbeitet wurde. Mir ist nur unklar, warum Visual C++, das schon seit 1000 und einem Jahr bequemer behandelt, aber ausgerechnet jetzt, wo es der Standard genauso macht, es nicht im Standard-Modus implementiert hat.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von dot »

Nun, /Za ist wohl hauptsächlich für (Abwärts-)Kompatibilität gedacht und der C Standard fordert das Newline am Ende z.B. immer noch. Ich hab mir vor langer Zeit angewöhnt, einfach immer ein Newline zu machen... ;)
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von Krishty »

Falls ihr euch noch erinnert, habe ich ja vor einiger Zeit eine Winkelklasse geschrieben, die den Winkel als Integer speichert, deren Wertebereich [0; 2³²[ als [0, 2pi[ interpretiert wird.

Mittlerweile ist mir klargeworden, dass man das auch gern auf 31 Bits verteilt haben möchte, um einen Double Cover zu erreichen, wo jeder Winkel zweimal dargestellt werden kann. Das wird nämlich immer dann enorm praktisch, wenn man auf Zylinderkoordinaten oder mit Kreis- und Ellipsebögen hantiert: viel Logik entfällt, sobald die Invariante (Endwinkel > Startwinkel) greift; was aber nur bei Double Cover möglich ist, weil ein Bogen ja bei 359° beginnen und 30° weiter wieder aufhören könnte, und der Wraparound auf 29° alles zerschösse.

Jedenfalls muss man, um das zu erreichen, tatsächlich nicht mehr machen als ein paar Bitmasken nach rechts zu verschieben, und schon flitzt alles. Darum steht es im Anti-Jammer-Thread. Darum, und weil es recht elegant ist.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von CodingCat »

Kleine sinnlose Spielerei zum Feiertag: Zero-Overhead Properties in C++

Code: Alles auswählen

#include <iostream>
#include <properties>

struct asdf {
    property_enable(asdf);

    float myFloat;

    property<int>
    {
        property_set(int new_value) {
            value = new_value * 2;
            std::cout << "my float:" << property_this->myFloat << std::endl;
        }
        property_get(int) const {
            return value - 1;
        }
    } property_make(member);
};
 
int main()
{
    asdf x = { 2.0f };
    x.member = 5;
    std::cout << x.member;
}
Möglich durch:

Code: Alles auswählen

#include <cstddef>
 
template <class Src, class Dest> Dest* transfer_cv(Src *, Dest *p) { return p; }
template <class Src, class Dest> const Dest* transfer_cv(const Src *, Dest *p) { return p; }
template <class Src, class Dest> volatile Dest* transfer_cv(volatile Src *, Dest *p) { return p; }
template <class Src, class Dest> const volatile Dest* transfer_cv(const volatile Src *, Dest *p) { return p; }
 
#define property_enable(type) typedef type property_container_type
#define property_this transfer_cv( this, container_from_property(this) )
 
template <class Value>
struct property_base
{
   typedef Value value_type;
   value_type value;
};
 
#define property struct : property_base
#define property_set(...) void operator =(__VA_ARGS__)
#define property_get(...) operator __VA_ARGS__()
#define property_make(name) name; \
static property_container_type* container_from_property(const volatile decltype(name)* p) \
{ \
   return (property_container_type*) ((char*) p - offsetof(property_container_type, name)); \
}
In Action: http://ideone.com/ooErUU ;)

Nachträgliche Fixes: __VA_AARGS__ für maximale Robustheit; const Getter.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Anti-Jammer-Thread

Beitrag von eXile »

Krishty hat geschrieben:Mittlerweile ist mir klargeworden, dass man das auch gern auf 31 Bits verteilt haben möchte, um einen Double Cover zu erreichen, wo jeder Winkel zweimal dargestellt werden kann. Das wird nämlich immer dann enorm praktisch, wenn man auf Zylinderkoordinaten oder mit Kreis- und Ellipsebögen hantiert: viel Logik entfällt, sobald die Invariante (Endwinkel > Startwinkel) greift; was aber nur bei Double Cover möglich ist, weil ein Bogen ja bei 359° beginnen und 30° weiter wieder aufhören könnte, und der Wraparound auf 29° alles zerschösse.
Cool, dann hast du eine erheblich bessere Antwort auf
Kristhy hat geschrieben:
eXile hat geschrieben:Doof nur, dass Quaternionen in einen Winkel bis zu 720° umgewandelt werden können.
Wo genau, außer bei Quaternion-Interpolation, ist das von Nutzen?
gegeben, als ich damals geben konnte.

Cats Properties sind sehr interessant; auch wenn container_from_property scharf aussieht. ;)

Damit ich im Anti-Jammer-Thread posten darf: Thunks funktionieren hier endlich, sowohl auf x86 wie auch x64. Das kommt dann in diesen Thread hier, braucht nur noch etwas Feinarbeit.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von CodingCat »

eXile hat geschrieben:Cats Properties sind sehr interessant; auch wenn container_from_property scharf aussieht. ;)
In der Tat, strenggenommen liefert offsetof für sehr viele Typen undefined behavior (non-standard-layout == alles, was nicht aus einer einfachen Ansammlung von standard-layout Members in einer einzigen Klasse besteht). Aber das ist nicht der einzige Grund, warum ich selbst nicht darauf zurückgreifen werde. Weitere Probleme umfassen implizite Konvertierungssequenzen, Typdeduktion (auch auto wertet zum Property-Typ aus, nicht zum Typ des angebotenen Wertes!), mangelhaftes Verhalten in Visual C++ (noch immer keine implizite Move-Funktionalität), Zerstörung von Argument-Dependent Lookup auf Properties ... Kurzum, es ist in C++ de facto unmöglich, einen Typen sauber transparent zu dekorieren. Folglich wird die Vortäuschung von Transparenz durch implizite Konvertierung langfristig fast zwangsläufig zum Problem.

Deshalb hier nachträglich die deutliche Anmerkung, dass dies als prototypisches Experiment zu verstehen ist, dessen erfolgreiche Umsetzung für den Produktiveinsatz sich im aktuellen Sprachstandard als unmöglich erweist. For science.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von Krishty »

Habt ihr zufällig qualifizierte Links, die mir erklären können, was Properties (in dem Sinne, den ihr hier diskutiert) überhaupt sind?

(Wikipedia spuckt nichts aus und wenn ich googel, komme ich immer nur zu Dokumentationen von Klassen, die in Property-Namespaces liegen.)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von dot »

Naja, sowas wie Properties in C# z.B. Im Prinzip Syntaxzucker, um Getter und Setter zu verwenden, als gäbe es einen entsprechenden Datenmember. Imo etwas, das man eigentlich eher vermeiden will... ;)
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von Krishty »

Okay. Wenn das Template eh implementierungsabhängig ist, kann man ja auch direkt Visual C++’ property-Erweiterung benutzen … die hat so Luxus wie mehrdimensionale Arrays und automatisch erzeugte Operatoren für += u. Ä..
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von Krishty »

Ich habe gerade zum ersten Mal erfolgreich eine Ausnahme geworfen; den passenden catch-Block angesteuert; Destruktoren ausgeführt; Stack Unwinding durchgeführt; den catch-Block ausgeführt; und die Kontrolle an das dahinterliegende Programm zurückgegeben. Zwar ist nun mein Registerinhalt Schrott, und es fehlen Sachen wie Zerstörung des geworfenen Objekts und Möglichkeiten zum throw;, aber ein Meilenstein nichtsdestotrotz.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Schrompf
Moderator
Beiträge: 4878
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von Schrompf »

Bin nicht ganz sicher, ob das "Jammer" oder "Anti-Jammer" ist, aber nach meinem aktuellen Gefühl bin ich hier schon richtig.

Ich habe vor zehn Minuten das erste Mal bei Amazon ein MP3-Album gekauft. Und soeben nach einem Telefonat das Geld dafür zurückerstattet bekommen. Warum? Weil zwar "MP3" draufsteht, ich aber trotzdem bis zu 10 Geräte über die Webseite freischalten muss und dann entweder die Files nur einzeln runterladen kann oder noch ein Browser-Plugin installieren muss, was auf Opera ja immer so eine wacklige Sache ist, weil die Plugins nur für Firefox geschrieben wurden.

Dabei hätte es so einfach sein können. Klick auf "Album kaufen", ZIP runterladen, fertig. Andere Leute kriegen es sogar hin, mich vorher noch nach gewünschtem Format und Bitrate zu fragen und dann die Mucke live für mich zu encoden und zusammenzupacken. Nicht so der Marktführer. Und damit können sie mich mal gerne haben. Ich habe einen MP3-Player, der eben nicht permanent online ist und mit den Herausgebern der jeweiligen Musik im Hintergrund konferiert, ob ich das Stück jetzt nun anhören darf oder nicht. Und ich habe einen antiken MP3-Taschenbarden mit 20GB interner Festplatte, der definitiv nichts dergleichen unterstützt. Und vor allem: ICH unterstütze das nicht. Nicht mit meinem Geld.

Mal schauen, ob das Label einen brauchbaren Webshop hat. Ansonsten: Hallo Tauschbörse, und der Rest der Welt kann mich mal.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Alexander Kornrumpf
Moderator
Beiträge: 2119
Registriert: 25.02.2009, 13:37

Re: Anti-Jammer-Thread

Beitrag von Alexander Kornrumpf »

Weißt du, in Zeiten in den Bandbreite relativ billig ist, frage ich mich immer, warum sie nicht das .iso zum Download anbieten, damit ich eine CD draus machen kann. Von CD zu MP3 komme ich relativ leicht. Von MP3 zurück zur CD ist unmöglich (Ja ich weiß es gibt Studien dass man das nicht hören kann. Dann fühle ich es eben).

An der Stelle möchte ich mal eine Lanze für die Collectors Edition von Nick Cave & the bad seeds brechen (obligatorisches Anti-Jammern!). Da ist bei jeder CD eine DVD dabei auf der das Album nochmal drauf ist, aber in 5.1 abgemischt. Und den Unterschied hörst du auf jeden Fall. Ich frage mich warum das nicht einfach bei jeder CD so ist. Kann ja nicht soviel Aufwand sein, wenn man ohnehin dabei ist das Ding zu produzieren. Und es wäre sicherlich mal ne Möglichkeit für die ach so gebeutelte Plattenindustrie etwas anzubieten was mp3 nicht kann.
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Anti-Jammer-Thread

Beitrag von Niki »

Viele hier kennen das Problem vielleicht noch von früher... CD-Rohlinge. Hunderte, ja tausende von selbstgebrannten CDs. Projekt-Backups auf CD jeden zweiten Tag. Datenaustausch mit dem Grafiker, via CD. Gebrannte Master CDs. Und was auch immer für CDs. Selbstgebrannte CDs überall. Lediglich der Stiel der Klobürste wurde noch nicht als CD-Spindel benutzt.

Einmal musste ich alte CDs bei einem Firmenumzug zur Müllhalde fahren. Was für ein Fehler! Der Aufseher bat mich doch tatsächlich die zu trennen. Also, jede CD raus aus dem Jewel-Case, und die Papier-Inlets und Backcover auch. Gerade bei den Backcovern faulen einem mit der Zeit die Fingerkuppen ab. Zum Glück waren es nicht so sehr viele CDs... vielleicht 200 aber auch das schmerzt schon!

Im Keller hatte ich drei große Säcke voll CDs. Ich habe nie gezählt, aber ich schätze so um die 3000 CDs. Lange habe ich überlegt wie ich die entsorgen kann. Definitiv pfriemel ich keine 3000 CDs auseinander um mir danach im Krankenhaus die Finger amputieren zu lassen, und habe deshalb eine Entsorgung schlicht ignoriert. Ehrlich gesagt kann ich mir immer noch nicht denken, dass dieser Trennungszwang damals so rechtens war, und das kam mir auch ziemlich dubios vor.

Im Keller also die Säcke voll CDs. Neben den CDs noch anderes Zeugs, welches wegen eines Wassereinbruchs zu Schrott wurde. Wie entsorgen? Gar nicht! Erst mal abwarten und Tee trinken, denn...

... die Natur findet schon seltsame Wege

So lebe ich in einem Haus mit mehreren Eigentumswohnungen. Jeder hat seinen eigenen Kellerraum, wobei ich meinen wegen des Wassereinbruchs nicht verschlossen hatte. War ja eh nichts von Wert im Keller.
Mieter kommen und Mieter gehen. Da kann's dann anscheinend passieren das einem Mieter aus Versehen der falsche Keller zugewiesen wird! Und nun ratet mal... ja, der arme Mann hat nichts-ahnend den ganzen Müll aus meinem Kellerraum entsorgt!

Eigentlich ist das ja gar nicht komisch, aber ich bin so froh über den leeren Keller, dass das ein Grund zum anti-jammern ist!
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von Krishty »

Ich hatte mir vor vier oder fünf Jahren mal die Mühe gemacht, alle meine alten Disketten, CDs, DVDs, und USB-Sticks auf den PC zu übertragen und die Daten zu sortieren und zu archivieren.

Die kümmerlichen 3 GiB, die sich als erhaltenswert erwiesen haben, liegen nun stets auf meinen externen Platten.

Die CDs habe ich jedenfalls vor dem Entsorgen nicht nur aus den Hüllen gepfriemelt, sondern auch zerstört – was nicht so einfach ist; die Zecken sind ziemlich robust. Aber es waren zum Glück nicht sooo viele.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: Anti-Jammer-Thread

Beitrag von Niki »

Was das Erhaltenswerte anbelangt, da hatte ich Glück, denn Dinge wie Goldmaster Backups und besseren Code hatte ich in meiner Wohnung, und nicht im Keller. Schade ist's nur um Dinge wie Originalboxen von Monkey Island, Ultima 7, Ultima Underworld und so. Aber durch den Wassereinbruch wird sowas unbrauchbar.
glassbear
Establishment
Beiträge: 324
Registriert: 08.04.2003, 18:09
Alter Benutzername: Enrico_
Echter Name: Enrico
Wohnort: San Diego
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von glassbear »

Schrompf hat geschrieben:Bin nicht ganz sicher, ob das "Jammer" oder "Anti-Jammer" ist, aber nach meinem aktuellen Gefühl bin ich hier schon richtig.

Ich habe vor zehn Minuten das erste Mal bei Amazon ein MP3-Album gekauft. Und soeben nach einem Telefonat das Geld dafür zurückerstattet bekommen. Warum? Weil zwar "MP3" draufsteht, ich aber trotzdem bis zu 10 Geräte über die Webseite freischalten muss und dann entweder die Files nur einzeln runterladen kann oder noch ein Browser-Plugin installieren muss, was auf Opera ja immer so eine wacklige Sache ist, weil die Plugins nur für Firefox geschrieben wurden.

Dabei hätte es so einfach sein können. Klick auf "Album kaufen", ZIP runterladen, fertig. Andere Leute kriegen es sogar hin, mich vorher noch nach gewünschtem Format und Bitrate zu fragen und dann die Mucke live für mich zu encoden und zusammenzupacken. Nicht so der Marktführer. Und damit können sie mich mal gerne haben. Ich habe einen MP3-Player, der eben nicht permanent online ist und mit den Herausgebern der jeweiligen Musik im Hintergrund konferiert, ob ich das Stück jetzt nun anhören darf oder nicht. Und ich habe einen antiken MP3-Taschenbarden mit 20GB interner Festplatte, der definitiv nichts dergleichen unterstützt. Und vor allem: ICH unterstütze das nicht. Nicht mit meinem Geld.

Mal schauen, ob das Label einen brauchbaren Webshop hat. Ansonsten: Hallo Tauschbörse, und der Rest der Welt kann mich mal.
Ja, bloede Sache. Ist mir auch schon ein paar Mal passiert, gerade auch mit Amazon und Audible ;(
Ein Hoch auf uns Männer... Auf die Frau, die uns HAT ( oder hat, und nicht weiß, dass sie uns hat ) ...auf die Idiotinnen ... besser gesagt VOLLPFOSTINNEN ... die uns hatten und uns verloren haben ... und auf die GLÜCKLICHEN, die das Vergnügen & Glück haben werden uns kennenzulernen!
antisteo
Establishment
Beiträge: 854
Registriert: 15.10.2010, 09:26
Wohnort: Dresdem

Re: Anti-Jammer-Thread

Beitrag von antisteo »

Ich bin auf der Landing Page von http://www.webgl.com/ gelistet
http://fedoraproject.org/ <-- freies Betriebssystem
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von kimmi »

Ich bin auf dem Test-Automation-Jornal aufgeführt worden : http://paper.li/peterflorijn/1337780558 . Und ich hab keine Ahnung, was das ist :). Und zwar mit einer Diskussion, die ich mit mir selber geführt habe: http://www.gamedev.net/topic/641302-how ... lgorithms/ ...

Gruß Kimmi
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von Krishty »

    enum class Flags {
        flag1 = 1,
        flag2 = 2,
        flag3 = 4,
        flag4 = 8
    };

    Flags foo = 9; //
Aus einer Datei gelesen oder so

Nun zeigt der Visual Studio 2012-Debugger für foo an:

    flag1 | flag4

Ich werde also auch alle Flag-Felder in meiner WinAPI als enum deklarieren; das macht alles tausend Mal einfacher.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von CodingCat »

Womit du mich gerade auf die Frage gebracht hast, wie man Flags eigentlich vernünftig umsetzt, ohne dabei stets auf Integers zurückzugreifen, wie ich es bisher tue. Woraufhin ich gerade entdeckt habe, dass sich Operatoren wohl auch für enums überladen lassen. Arbeitseffizient aber wohl nur mit Makros? :-/ Weitere Nachforschung erforderlich.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von Krishty »

Vernünftig oder effizient? ;-)

Vernünftig wären natürlich enum class Flags-Werte mit einem überladenen operator | (), der ein Ergebnis vom Typ FlagCombination<Flags> ausspuckt.

Praktisch mache ich es aber wohl eher wie oben beschrieben. Einen überladenen operator | () brauche ich aber wohl trotzdem.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von CodingCat »

Kurzes Rumprobieren brachte mich auf folgendes, überraschenderweise ohne Makros:

ACHTUNG: Funktioniert nur mit g++, nicht mit clang/MSVC

Code: Alles auswählen

struct MakeFlags
{
    template <class T>
    friend T operator |(T a, T b) { return (T) ((int) a | (int) b); }
    template <class T>
    friend T operator &(T a, T b) { return (T) ((int) a & (int) b); }
};
 
struct Flags : MakeFlags {
    enum T { Flag1 = 1, Flag2 = 2, Flag3 = 4 };
};
 
int main()
{
    Flags::T test = Flags::Flag1 | Flags::Flag2;
    return 0;
}

In Action: http://ideone.com/KsG5MW

Mit stärkeren C++11 Enums sieht das wohl etwas weniger rosig aus. Achtung bei der Überladung, ich bin erstmal voll in die Rekursion reingefallen ohne die int-Casts.

Nachtrag: MSVC und clang verstehen es leider nicht. Also doch Makros ... :-/
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von dot »

Code: Alles auswählen

template <class T>
T operator |(T a, T b) { return (T) ((int) a | (int) b); }

template <class T>
T operator &(T a, T b) { return (T) ((int) a & (int) b); }

template <class T>
struct MakeFlags
{
  friend T operator |<T>(T a, T b);
  friend T operator &<T>(T a, T b);
};
 
enum Flags { Flag1 = 1, Flag2 = 2, Flag3 = 4 };


template struct MakeFlags<Flags>;
 
int main()
{
    Flags test = Flag1 | Flag2;
    return 0;
}
in action ;)
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von CodingCat »

dot hat geschrieben:in action ;)
Ist dir klar, was du da tust, oder ist mir unklar, was du da tust? Mir scheint, du hebst jegliche Typsicherheit für sämtliche Typen auf. :P
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von dot »

Ja, der halbe Code ist sowieso unnötig, da hab ich mich ein bisschen zu sehr dem Fluss der Dinge hingegeben... :P

Edit: Aber das wär vielleicht eine Lösung

Code: Alles auswählen

namespace MakeFlags
{
  template <class T>
  T operator |(T a, T b) { return (T) ((int) a | (int) b); }
   
  template <class T>
  T operator &(T a, T b) { return (T) ((int) a & (int) b); }
}

namespace Flags
{
  using MakeFlags::operator |;
  using MakeFlags::operator &;

  enum T { Flag1 = 1, Flag2 = 2, Flag3 = 4 };
}

 
int main()
{
  Flags::T test = Flags::Flag1 | Flags::Flag2;
  return 0;
}
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: Anti-Jammer-Thread

Beitrag von CodingCat »

dot hat geschrieben:Ja, der halbe Code ist sowieso unnötig, da hab ich mich ein bisschen zu sehr dem Fluss der Dinge hingegeben... :P

Edit: Aber das wär vielleicht eine Lösung
Jep, darauf bin ich auch schon gekommen, sehe aber keinen Vorteil gegenüber Makro dann, bzw. würde Makro vorziehen, weil weniger Schreibarbeit und weniger Komplexität.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Antworten