Fehler, Irrtümer, Fragen - Seite 1184

 
A100:

Welche Zeigeroperationen sind nicht sinnlos?

Alles, wofür normalerweise Referenzen verwendet werden.
 
Zum Beispiel kann ein Additionsoperator zwischen Referenzen angewendet werden, was den Operator+(...) aufruft. Die Hinzufügung von Zeigern macht keinen Sinn, weil wir dann eine Zahl erhalten, die keinen praktischen Nutzen hat.
 
A100:
Was hindert Operatoren, die keinen Sinn machen, daran, sie als Objekte zu überladen oder sie einfach nicht zu implementieren?
 

So ist es jetzt (überladen wie bei Objekten) und alles scheint in Ordnung zu sein. Aber es gibt einen Widerspruch zwischen dem Sinnvollen (== und !=) und dem Rest

class A {
public:
        bool operator ==( A* a ) { Print( __FUNCTION__ ); return ( true  );  }
        bool operator !=( A* a ) { Print( __FUNCTION__ ); return ( true  );  }
//остальные
        bool operator >>( A* a ) { Print( __FUNCTION__ ); return ( true  );  }
        bool operator +( A* a )  { Print( __FUNCTION__ ); return ( false  ); }
        bool operator !()        { Print( __FUNCTION__ ); return ( true   ); }
//... и т.д.
};

als

void OnStart()
{
        A *a = new A;
        if ( a == a ) Print( "1" ); //сравнение указателей как чисел
        if ( a >> a ) Print( "3" ); //вызывается operator<<( A *)
}

Wir schlagen vor, dies zu beseitigen, indem Zeiger nur mit der speziellen Funktion

void OnStart()
{
        A *a = new A;
        if ( isEqualPoiner( a, a ) ) Print( "1" ); //сравнение указателей как чисел
        if ( a == a )               Print( "2" ); //вызывается operator==( A *)
        if ( a >> a )               Print( "3" ); //вызывается operator<<( A *)
}
 

Eine spezielle Funktion für den Vergleich von Zeigern kann wie folgt gestaltet werden

template<typename T1, typename T2>
bool isEqualPointer( T1 *t1, T2 *t2 ) { return ( ulong(t1) == ulong(t2) ); }
 
A100:

Ich habe eine indiskrete Frage an Sie. Werden Sie Ihre Erfahrungen weitergeben?

Sie sind einer der wenigen Menschen, die aktiv und ständig Vorlagen und Makros verwenden. Und Sie haben wahrscheinlich eine große Menge an angesammeltem Code.

Ich weiß nicht, wie es anderen geht, aber ich wäre sehr daran interessiert, Ihren Code und Ihre Entwicklungen zu sehen, wenn Sie welche haben, die Sie gerne mit der Öffentlichkeit teilen.

Ich weiß es nicht... Implementierung von Mustern, Ihre Wrapper für die Arbeit mit Indikatoren, Charts, was auch immer...

 

Wie verwende ich Vorlagen? - Um einen Eintrag zu kürzen. Zum Beispiel gibt es in MQL keine Komma-Operation. Nehmen wir an, es gibt einen Datensatz

int f2( string str )
{
        Print( str );
        return ( 0 );
}

bool f( int a )
{
        if ( a == 5 )
                return ( true )
        f2( "abc" );
        return ( false );
}
Dann ein Muster haben
template<typename T 1, typename T 2>
T2 opComma( T1 expression, T2 assignment_expression ) { return ( assignment_expression ); }

anstelle von 4 Zeilen haben wir eine

bool f( int a )
{
        return ( a == 5 ? true : opComma( f2( "abc" ), false ) );
}
 

Wie verwende ich Makros? - Nochmals - um das Protokoll zu verkürzen. In MQL gibt es zum Beispiel keine Klassenvorlagen. Kein Problem - wir verwenden ein Makro

#define  Macro( type ) \
class A {       \
public:         \
/*...еще много строк...*/ \
        type a; \
};

//осталось написать
Macro(  uint )
Macro( ulong )
 
Um es noch einmal kurz zu machen - nachdem wir einmal definiert haben
#define  MDT( dt_struct, dt )     \
        MqlDateTime dt_struct;   \
        ZeroMemory( dt_struct ); \
        TimeToStruct( dt, dt_struct );

reicht es dann aus, zu erklären

datetime dt;
MDT( dt_struct, dt )
 

Bitweises Kopieren wird zum Beispiel durch Vorlagen implementiert, da mehrere Typen gleichzeitig beteiligt sein können

template<typename T1, typename T2>
T2 BitwiseCopying( T1 type1, T2 )
{
struct Union1 {
        T1      type1;
};
struct Union2 {
        T2      type2;
};
        Union1 union;
        union.type1 = type1;
        return ( ((Union2)union).type2 );
}
void f()
{
        ulong ul = 0x16;
        double d = BitwiseCopying( ul, double(0)); //побитовое копирование из ulong в double
        float f = 36.6;
        uint ui = BitwiseCopying( f,    uint(0));  //побитовое копирование из float в uint

}