エラー、バグ、質問 - ページ 1184

 
A100:

意味のないポインタ演算はどれか?

通常、リファレンスが使用されるもの。
 
例えば、参照と参照の間に加算演算子を適用すると、operator+(...)を呼び出すことができる。ポインターを足しても、実用性のない数値が得られるので、意味がない。
 
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行ではなく、1行になります

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

}