错误、漏洞、问题 - 页 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

}