Errori, bug, domande - pagina 1184

 
A100:

Quali operazioni con i puntatori non sono senza senso?

Tutto ciò per cui si usano normalmente i riferimenti.
 
Per esempio, un operatore di addizione può essere applicato tra riferimenti, che chiamerà operator+(...). L'aggiunta di puntatori non ha senso, perché otterremo un numero che non ha alcun uso pratico.
 
A100:
Cosa impedisce agli operatori che non hanno senso di sovraccaricarli come oggetti o semplicemente di non implementarli?
 

Questo è il modo in cui è ora (sovraccarico come per gli oggetti) e tutto sembra andare bene. Ma c'è una contraddizione tra il significativo (== e !=) e il resto

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   ); }
//... и т.д.
};

come

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

Che suggeriamo di eliminare confrontando i puntatori solo attraverso la funzione speciale

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 *)
}
 

Una funzione speciale per confrontare i puntatori può essere progettata come segue

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

Ho una domanda indiscreta per te. Hai intenzione di condividere le tue esperienze?

Sei una delle poche persone che usano attivamente e costantemente modelli e macro. E probabilmente avete una grande quantità di codice accumulato.

Non so gli altri, ma sarei molto interessato a vedere il vostro codice e i vostri sviluppi, se ne avete, che non vi dispiace condividere con il pubblico.

Non so... l'implementazione di modelli, i vostri wrapper per lavorare con indicatori, grafici, qualsiasi cosa...

 

Come si usano i modelli? - Per abbreviare una voce. Per esempio, non esiste un'operazione virgola in MQL. Diciamo che c'è un record

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

bool f( int a )
{
        if ( a == 5 )
                return ( true )
        f2( "abc" );
        return ( false );
}
Poi avere un modello
template<typename T 1, typename T 2>
T2 opComma( T1 expression, T2 assignment_expression ) { return ( assignment_expression ); }

invece di 4 linee ne abbiamo una sola

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

Come si usano le macro? - Di nuovo - per abbreviare il record. Per esempio, non ci sono modelli di classe in MQL. Non è un problema - usiamo una macro

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

//осталось написать
Macro(  uint )
Macro( ulong )
 
Ancora una volta per abbreviare il disco - avendo definito una volta
#define  MDT( dt_struct, dt )     \
        MqlDateTime dt_struct;   \
        ZeroMemory( dt_struct ); \
        TimeToStruct( dt, dt_struct );

sarà poi sufficiente dichiarare

datetime dt;
MDT( dt_struct, dt )
 

La copia bitwise, per esempio, è implementata tramite modelli, dato che diversi tipi possono essere coinvolti contemporaneamente

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

}