오류, 버그, 질문 - 페이지 1184

 
A100 :

포인터를 사용한 작업이 의미가 없는 것은 무엇입니까?

참조가 일반적으로 사용되는 모든 것.
 
예를 들어, 연산자+(...)를 호출하는 참조 사이에 더하기 연산자를 적용할 수 있습니다. 포인터를 추가하는 것은 의미가 없습니다. 실용적인 적용이 없는 숫자를 얻게 될 것이기 때문입니다.
 
A100 :
의미가 없는 연산자가 개체에 대해 오버로드하거나 단순히 구현하지 않는 것을 방지하는 것은 무엇입니까?
 

이제 이것은 완료되었고(객체에 대해 과부하됨) 모든 것이 잘 된 것 같습니다. 그러나 의미 있는 것(== 및 !=)과 나머지 사이에는 모순이 있습니다.

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

하는 한

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

특별한 함수를 통해서만 포인터를 비교함으로써 제거하자는 제안

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

포인터 비교를 위한 특수 함수는 다음과 같이 작성할 수 있습니다.

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

당신에게 무심코 질문이 있습니다. 작업을 공유하시겠습니까?

당신은 템플릿과 매크로를 적극적이고 지속적으로 사용하는 몇 안 되는 사람 중 하나입니다. 그리고 아마도 많은 양의 누적 코드가 있을 것입니다.

다른 사람은 모르지만 공개적으로 게시하는 것을 꺼려하지 않는 코드와 작업을 보는 것은 저에게 매우 흥미로울 것입니다.

몰라... 패턴 구현, 지표 작업을 위한 사용자 정의 래퍼, 차트 등...

 

템플릿은 어떻게 사용합니까? - 녹음을 줄이려면. 예를 들어, MQL에는 쉼표 연산 이 없습니다. 기록이 있다고 하자

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

bool f( int a )
{
         if ( a == 5 )
                 return ( true )
        f2( "abc" );
         return ( false );
}
그런 다음 패턴을 가지고
template <typename T 1, typename T 2>
T2 opComma( T1 expression, T2 assignment_expression ) { return ( assignment_expression ); }

4줄 대신 - 하나를 얻습니다.

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

매크로는 어떻게 사용합니까? - 다시 - 기록을 줄입니다. 예를 들어 MQL에는 클래스 템플릿이 없습니다. 중요하지 않습니다. 매크로를 사용하세요.

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

//осталось написать
Macro(   uint )
Macro( ulong )
 
다시, 표기법을 단축하기 위해 - 한 번 정의하면
 #define MDT( dt_struct, dt )     \
         MqlDateTime dt_struct;   \
         ZeroMemory ( dt_struct ); \
        TimeToStruct ( dt, dt_struct );

나중에 선언하는 것으로 충분합니다.

 datetime dt;
MDT( dt_struct, dt )
 

예를 들어 여러 유형이 한 번에 참여할 수 있으므로 템플릿을 통해 비트 단위 복사를 구현합니다.

 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

}
사유: