int, long usw durch Objekte ersetzen



  • ExtOOS schrieb:

    Danke Konrad,
    habe es gerade getestet. Der gcc optimiert alles weg.

    Asche auf mein Haupt …

    😉



  • mit templates könntest du da auch schön pervers abgehen. ich mein so, dass du es dir sparen kannst, jedes mal ne methode vom leder zu reißen, wenn du ne funktion für deine klassen findest. angenommen du hast ne funktion zum quadrieren, die du jetzt auch so wie die wurzel (als methode mit seiteneffekten) verwenden willst, ohne an deinen klassen rumfuhrwerken zu wollen:

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    template<typename T>
    class Number
    {
        typedef T value_type;
    
        template<typename TT>
        friend ostream &operator<<(ostream &, const Number<TT> &);
    
    public:
    	Number(T value)
        : m_value(value)
        {
        }
    
    	template<typename F>
    	void operator()(const F &func)
    	{
    	    m_value = func(m_value);
    	}
    
    private:
    	value_type m_value;
    };
    
    template<typename T>
    ostream &operator<<(ostream &strm, const Number<T> &num)
    {
        return strm << num.m_value;
    }
    
    int quad(int a)
    {
        return a*a;
    }
    
    int main()
    {
        Number<int> x = 49;
    
        x(sqrtf);
        cout << x << "\n";
    
        x(quad);
        cout << x << endl;
    }
    


  • @ExtOOS: Mann kann sich auch mit nem Hammer aufn Kopf hauen, das ist auch eine dumme Idee und tut weh.
    Ideen haben manche Leute... 😕



  • finde ich auch net so cool die idee.. aber jedem das seine;) :schland:



  • Ich verwende solche Wrapper-Klassen, fast ausschließlich als Member-Variablen, weil man dann nicht so schnell vergisst sie zu initialisieren. Und außerdem kann dann gleich in der Deklaration der Default-Wert mitangegeben werden (vor allem bei multiplen Konstruktoren ist es recht nützlich).



  • hustbaer schrieb:

    @ExtOOS: Mann kann sich auch mit nem Hammer aufn Kopf hauen, das ist auch eine dumme Idee und tut weh.
    Ideen haben manche Leute... 😕

    🙂 - Finde ich auch.

    Ich finde das ganze in etwa so sinnvoll, wie die bool - Klasse, die hier rumgegeistert ist. 😉



  • @Superlexx:
    Wenn du damit leben kannst dass > 90% aller Leute die jemals deinen Code lesen werden sich "WTF!?!" denken ... dann mach das ruhig weiter so.



  • Das ist doch nur ne Menge unnützer Arbeit sowas zu schreiben.



  • Der Compiler dürfte das meiste vermutlich inlinen und der Performance unterschied dürfte gering sein. (Aber vermutlich wird Dein Binary aufgebläht). Aber wenn es Dir wichtig ist, dann mess es nach!

    Aber ganz ehrlich: Wozu sich die Mühe machen? Schreib lieber sinnvollen Code in der Zeit.

    Oder nutz die Zeit um folgenden Artikel durchzulesen: http://www.ddj.com/cpp/184401197



  • Die Wrapper werden in dem Code, mit dem ich zur Zeit arbeite, die wenigsten WTFs hervorrufen (wer derart simple Konstrukte nicht versteht, sollte am Code halt nicht rumfummeln). Den Grund, es so zu machen, habe ich ja bereits genannt: man braucht sich nicht darum kümmern, die Membervariablen zu initialisieren, und spart sich dadurch überflüssigen und u.U. fehleranfälligen Construktor-Code, etwa:

    #include "types.h" // <- defines class Int and template class IntT
    class c
    {
       IntT<42> m_x;
    
    public:
       Int GetX() const {return m_x;}
    // int GetX() const {return m_x;} <- is also an option
    };
    
    void f()
    {
       c cObj;
       assert(cObj.GetX() == 42);
    
       Int i;
       assert(i == 0);
    }
    

    Verhält sich schon ein wenig wie im C#, aber das ist erwünscht :).



  • Superlexx schrieb:

    IntT<42> m_x;
    

    Wow! 😮
    Ist dir klar was du da tust, bzw anrichtest ? 😃



  • So viele spezialisierungen werden es schon nicht sein...



  • Soll wirklich folgendes die Begründung sein:

    float f = 13;
    sqrt(13);

    ist so viel hässlicher als

    Float f(13);
    f.sqrt();

    😕 😕



  • WTF? schrieb:

    Soll wirklich folgendes die Begründung sein:

    float f = 13;
    sqrt(13);

    ist so viel hässlicher als

    Float f(13);
    f.sqrt();

    😕 😕

    1.) Ja ("sqrt()" ist keinen Eigenschaft einer Zahl sondern ... tada: Eine Funktion)
    2.) und erst recht

    float f1 = 3.4;
    float f2 = f1 + 4.5;
    f1 = 5.6;
    =>
    Float f1(3.4);
    Float f2(f1);
    f2.add(4.5);
    f1.set(5.6);
    

    Irgendwie scheinen bei dem "Konzept" Ursache und Wirkung durcheinandergekommen zu sein:
    1.) Weil man in Java vor lauter Angst freie Funktionen und operator-Überladung verboten hat, ist man gezwungen, für eigene Datentypen solche Kunstkonstruktionen zu verwenden.
    2.) .... und weil man sich das dann so angewöhnt hat, meint man plötzlich, das in C++ auch so machen zu müssen - obwohl es die o.g. Einschränkungen gar nicht hat....
    Das ist einfach schräg.

    Gruß,

    Simon2.



  • Zumal es objektorientiert gesehen auch nicht wirklich Sinn macht. i.sqrt() zu schreiben. Da Wurzel nicht die Funktion einer Zahl ist, sondern man die Wurzel einer Zahl will. Letzteres macht vl mit GetSqrt Sinn, aber für mich ist das klassisch für eine normale Funktion. Mal ganz abgesehen davon, dass es auch in der Mathematik so funktioniert.



  • Vor allem kann man es nicht konsequent durchziehen. Man müsste immer wieder an der Klasse rumwurschteln, wenn man was neues benutzen will. Es wäre eine Zahlenklasse, die nie fertig wird. So etwas kann man keinem zumuten.



  • Superlexx schrieb:

    Die Wrapper werden in dem Code, mit dem ich zur Zeit arbeite, die wenigsten WTFs hervorrufen (wer derart simple Konstrukte nicht versteht, sollte am Code halt nicht rumfummeln). Den Grund, es so zu machen, habe ich ja bereits genannt: man braucht sich nicht darum kümmern, die Membervariablen zu initialisieren, und spart sich dadurch überflüssigen und u.U. fehleranfälligen Construktor-Code, etwa:

    Freund. Es geht nicht darum dass irgendwer deinen Code nicht versteht weil er zu "schwierig" ist. Schwierig ist er nicht. Es geht darum dass sich jeder denken wird "was is das für ein Pfosten der das Programm geschrieben hat?". Und das zu Recht.
    Warum? Ganz einfach *weil man das eben nicht so macht*. Kein vernünftiger Programmierer würde das so schreiben, daher erwartet auch kein vernünftiger Programmierer sowas anzutreffen.


Anmelden zum Antworten