Errores, fallos, preguntas - página 1184

 
A100:

¿Qué operaciones con punteros no tienen sentido?

Cualquier cosa para la que se utilicen normalmente las referencias.
 
Por ejemplo, se puede aplicar un operador de adición entre referencias, que llamará operador+(...). La adición de punteros no tiene sentido, porque obtendremos un número que no tiene ninguna utilidad práctica.
 
A100:
¿Qué impide que los operadores que no tienen sentido los sobrecarguen como objetos o simplemente no los implementen?
 

Así es como está ahora (sobrecargado como para los objetos) y todo parece estar bien. Pero hay una contradicción entre lo significativo (== y !=) y el 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   ); }
//... и т.д.
};

como

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

Lo que sugerimos eliminar comparando los punteros sólo a través de la función especial

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

Se puede diseñar una función especial para comparar punteros de la siguiente manera

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

Tengo una pregunta indiscreta para ti. ¿Vas a compartir tus experiencias?

Usted es una de las pocas personas que utiliza activa y constantemente plantillas y macros. Y probablemente tenga una gran cantidad de código acumulado.

No sé nadie más, pero me interesaría mucho ver tu código y tus desarrollos, si los tienes, que no te importe compartir con el público.

No sé... implementación de patrones, sus envoltorios para trabajar con indicadores, gráficos, lo que sea...

 

¿Cómo se utilizan las plantillas? - Para acortar una entrada. Por ejemplo, en MQL no existe la operación coma. Digamos que hay un registro

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

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

en lugar de 4 líneas tenemos una

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

¿Cómo se utilizan las macros? - Una vez más, para acortar el expediente. Por ejemplo, no hay plantillas de clases en MQL. No hay problema - usamos una macro

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

//осталось написать
Macro(  uint )
Macro( ulong )
 
De nuevo para acortar el registro - habiendo definido una vez
#define  MDT( dt_struct, dt )     \
        MqlDateTime dt_struct;   \
        ZeroMemory( dt_struct ); \
        TimeToStruct( dt, dt_struct );

posteriormente bastará con declarar

datetime dt;
MDT( dt_struct, dt )
 

La copia a nivel de bits, por ejemplo, se realiza mediante plantillas, ya que pueden intervenir varios tipos a la vez

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

}