Par exemple, un opérateur d'addition peut être appliqué entre des références, ce qui appellera l'opérateur+(...). L'ajout de pointeurs n'a aucun sens, car nous obtiendrons un nombre qui n'a aucune utilité pratique.
C'est ainsi que cela se passe maintenant (surchargé comme pour les objets) et tout semble aller bien. Mais il y a une contradiction entre ce qui est significatif (== et !=) et le reste.
voidOnStart()
{
A *a = new A;
if ( a == a ) Print( "1" ); //сравнение указателей как чиселif ( a >> a ) Print( "3" ); //вызывается operator<<( A *)
}
Ce que nous proposons d'éliminer en comparant les pointeurs uniquement par le biais de la fonction spéciale
voidOnStart()
{
A *a = new A;
if ( isEqualPoiner( a, a ) ) Print( "1" ); //сравнение указателей как чиселif ( a == a ) Print( "2" ); //вызывается operator==( A *)if ( a >> a ) Print( "3" ); //вызывается operator<<( A *)
}
J'ai une question indiscrète à vous poser. Allez-vous partager vos expériences ?
Vous êtes l'une des rares personnes à utiliser activement et constamment des modèles et des macros. Et vous avez probablement une grande quantité de code accumulé.
Je ne sais pas pour les autres, mais je serais très intéressé de voir votre code et vos développements, si vous en avez, que vous ne voyez pas d'inconvénient à partager avec le public.
Je ne sais pas... l'implémentation des modèles, vos enveloppes pour travailler avec les indicateurs, les graphiques, tout ce que vous voulez...
Comment utiliser les modèles ? - Pour raccourcir une entrée. Par exemple, il n'y a pas d'opération virgule dans MQL. Disons qu'il y a un enregistrement
int f2( string str )
{
Print( str );
return ( 0 );
}
bool f( int a )
{
if ( a == 5 )
return ( true )
f2( "abc" );
return ( false );
}
Puis avoir un modèle
template<typename T 1, typename T 2>
T2 opComma( T1 expression, T2 assignment_expression ) { return ( assignment_expression ); }
au lieu de 4 lignes, nous en avons une
bool f( int a )
{
return ( a == 5 ? true : opComma( f2( "abc" ), false ) );
}
Comment utiliser les macros ? - Encore une fois - pour raccourcir le dossier. Par exemple, il n'y a pas de modèles de classe dans MQL. Pas de problème - nous utilisons une macro
#define Macro( type ) \
class A { \
public: \
/*...еще много строк...*/ \
type a; \
};
//осталось написать
Macro( uint )
Macro( ulong )
Le fait de n'adopter que (*a) pour faire référence aux fonctions membres n'apporte pas d'avantages évidents, mais conduit au contraire à l'impossibilité d'une application multiple simple et claire des opérateurs.
Essayez de le réécrire en tenant compte de votre suggestion.
Vous ne pouvez pas utiliser l'objet lui-même au lieu du pointeur car l'opérateur <<(...) ne peut retourner qu'un pointeur vers l'objet.
Vous avez dû mal comprendre. Je ne parlais pas de désactiver l'implémentation actuelle. J'ai demandé à ce qu'il soit possible en plus de prendre une référence ou un pointeur sur un objet afin de ne pas dépendre des caprices du compilateur.Et je déciderai de ce qu'il faut faire dans chaque cas. Si j'ai besoin d'un programme super fiable, je peux facilement le faire de la manière que vous avez décrite. Oui, c'est compliqué. Mais si les métacitations introduisent soudainement une action spéciale de l'opérateur << pour les pointeurs, nous n'en aurons pas peur.
C'est ainsi que cela se passe maintenant (surchargé comme pour les objets) et tout semble aller bien. Mais il y a une contradiction entre ce qui est significatif (== et !=) et le reste.
comme
Ce que nous proposons d'éliminer en comparant les pointeurs uniquement par le biais de la fonction spéciale
Une fonction spéciale pour comparer les pointeurs peut être conçue comme suit
J'ai une question indiscrète à vous poser. Allez-vous partager vos expériences ?
Vous êtes l'une des rares personnes à utiliser activement et constamment des modèles et des macros. Et vous avez probablement une grande quantité de code accumulé.
Je ne sais pas pour les autres, mais je serais très intéressé de voir votre code et vos développements, si vous en avez, que vous ne voyez pas d'inconvénient à partager avec le public.
Je ne sais pas... l'implémentation des modèles, vos enveloppes pour travailler avec les indicateurs, les graphiques, tout ce que vous voulez...
Comment utiliser les modèles ? - Pour raccourcir une entrée. Par exemple, il n'y a pas d'opération virgule dans MQL. Disons qu'il y a un enregistrement
Puis avoir un modèletemplate<typename T 1, typename T 2> T2 opComma( T1 expression, T2 assignment_expression ) { return ( assignment_expression ); }au lieu de 4 lignes, nous en avons une
Comment utiliser les macros ? - Encore une fois - pour raccourcir le dossier. Par exemple, il n'y a pas de modèles de classe dans MQL. Pas de problème - nous utilisons une macro
il suffira ensuite de déclarer
datetime dt; MDT( dt_struct, dt )La copie bit à bit, par exemple, est mise en œuvre par le biais de modèles, puisque plusieurs types peuvent être impliqués en même temps.
Le fait de n'adopter que (*a) pour faire référence aux fonctions membres n'apporte pas d'avantages évidents, mais conduit au contraire à l'impossibilité d'une application multiple simple et claire des opérateurs.
Essayez de le réécrire en tenant compte de votre suggestion.
Vous ne pouvez pas utiliser l'objet lui-même au lieu du pointeur car l'opérateur <<(...) ne peut retourner qu'un pointeur vers l'objet.
Vous avez dû mal comprendre. Je ne parlais pas de désactiver l'implémentation actuelle. J'ai demandé à ce qu'il soit possible en plus de prendre une référence ou un pointeur sur un objet afin de ne pas dépendre des caprices du compilateur.Et je déciderai de ce qu'il faut faire dans chaque cas. Si j'ai besoin d'un programme super fiable, je peux facilement le faire de la manière que vous avez décrite. Oui, c'est compliqué. Mais si les métacitations introduisent soudainement une action spéciale de l'opérateur << pour les pointeurs, nous n'en aurons pas peur.