Yazma hakkında soru - sayfa 2

 
Ilya Malev :

Başka bir deyişle, yazdıklarımı tekrarladınız. Soru, yapıp yapamayacağı değil, neden yapamadığı ve onu zarafetle nasıl aşacağıydı.

dönüşümler için basit işlevler yazmak ve yöntemlerin içinde geçiş yapmamak için?

double Double(CParametre<double>)

string Dize(CParameter<double>)

ve kullan :

PrintFormat ("%s %s %f",String(param1),String(param2),Double(param1));

ve tekli bir operatör veya adlandırılmış bir işlev kullanmanın farkı nedir? işlev daha iyidir - operatör zaten anlamsal bir yüke sahiptir ve keyfi olarak değiştirmek buz değildir

 
fxsaber :

Tip kontrolü kayboldu. Bu soruların yanıtları için C++ kaynaklarına bakın. Sanırım çok sık soruluyorlar.

En azından bunun bir mql sınırlaması değil, genel olarak C++'ın bir özelliği olduğunu anladım ve bunun için teşekkürler :)

 
Ve aşırı yüklenmiş operatörün lparamını belirli bir nesneye veya yapıya bağlamadan operatörleri aşırı yüklemenin imkansızlığı, bu da C++'ın bir özelliği midir?
 
Ilya Malev :

Açık aşırı yükleme ve aritmetik eylemlerle her şey açıktır. Evet, aşırı yüklenmiş = bu durumda açıkça daha başarılı, doğru fark ettiniz, sadece bir soru için aceleyle bir örnek oluşturdum ve gerçekten düşünmedim (sayı sadece int değil, aynı zamanda char, uchar, short, ushort, uint, bool ve color, yani her şey açık değil))))))


Burada soru, aşırı yüklenmiş yöntemin dönüş türünün nesnenin içeriğine bağlı olmasıdır.

Örneğin bir multi-type dizimiz var (çoklu kitap olduğu için örnek vermeyeceğim). Ve elbette, herhangi bir dizide, karşılık gelen dizine sahip değişkenin değerini döndüren bir dizin oluşturma işlemi [] olmalıdır.

Ancak değişkenlerin farklı türleri vardır. Bu dizin altında bir tarih olabilir veya bir dize veya hatta bazı özel türler olabilir. Ve ideal olarak, [] dizine eklerken döndürülen değerin türünün, açıkça parametreleştirmeye gerek kalmadan karşılık gelen türü otomatik olarak üretmesini isterim. Daha önce, bu "problemi" şu şekilde çözmüştüm: var[(char)1], var[(short)1], var[(uint)1], vb. ama bu koltuk değnekleri iyi değil.

Bir dizi mqlparam tipi yapı kullanın.

 
Dmitry Fedoseev :

Bir dizi mqlparam tipi yapı.

Aynı şekilde double, string veya long olarak eşitleyemezsiniz.

MqlParam par;

par.double_value = Sor;

çift d = par; // '=' - yasadışı işlem kullanımı

 
Ilya Malev :

Aynı şekilde double, string veya long olarak eşitleyemezsiniz.

MqlParam par;

par.double_value = Sor;

çift d = par; // '=' - yasadışı işlem kullanımı

Hangi türe bakarsınız ve ilgili alana uygun olursunuz. Çarpık bir yaklaşım gibi görünüyor ve hala mükemmel çözümü arıyorsunuz. Böyle bir görev hiç ortaya çıkmamalıdır.

 
Ilya Malev :
Ve aşırı yüklenmiş operatörü belirli bir nesneye veya yapıya bağlamadan operatörleri aşırı yüklemenin imkansızlığı, bu da C++'ın bir özelliği mi?

İşte internette bu konuda yazdıkları:

Yalnızca dönüş türlerinde farklılık gösterirlerse, işlev aşırı yüklemesi mümkün değildir.

C++14 13.1/2 standardı:

 

Bunu benzer bir soruya yanıt olarak web'de buldum:

 template < typename T> T f();
template <> int f() { return 2 ; }
template <> double f() { return 2.7 ; }

//...
struct F {
    F() {}
     template < typename T> operator T() { return f<T>(); }
};

int x2 = F();
double y2 = F();


Anladığım kadarıyla, burada "operator T ()" yayın operatörü aşırı yüklenmiş, bu da C++'da bunun en azından mümkün olduğu anlamına geliyor. Ve mql'de, anladığım kadarıyla henüz değil.

 
Ilya Malev :
benzer bir soru: neden, bir yöntem aşırı yüklenirken ( aşırı yüklenmiş bir yöntemin imzasında ), dönüş türü görünmüyor, yalnızca parametre türleri görünüyor. yani, farklı dönüş türleriyle iki özdeş yöntem tanımlayamazsınız. neden böyle bir kısıtlama var? bunun anlamı nedir, aynı parametrelerle dönüş değerinin türüne göre yöntemi aşırı yüklemek neden imkansız

Muhtemelen bu yüzden:

 int f() {
   call_something();
   return 0 ;
}

double f() {
   call_something_other();
   return 0 ;
}

void start() {
   f();
}

Hangi fonksiyon çağrılmalıdır?

 
pavlick_ :

Muhtemelen bu yüzden:

Hangi fonksiyon çağrılmalıdır?

Muhtemelen derleme aşamasında bir şablon uyuşmazlığı hatası oluşturulmalıdır.


Ancak bir dizi nesnesinin olduğu bir durumda

 class Array{

public :

Array * operator [] ( int i){ id = i; return GetPointer ( this ); }

double operator []( int i){ id = i; return data[i]; }

Array * operator =( double d){ data[id]=d; return GetPointer( this ); }

private :

double data[ 10 ];

int id;

};



int OnStart (){

  Array array;

   double d= 123.456 ;

  array[ 5 ]=d;

  d=array[ 5 ];

}

Böyle bir hata oluşmamalıdır, çünkü ilk durumda, Array[int] çağrısı, = işleminin sol parametresi olarak kullanılır ve bir çift değişken değildir ve ikinci durumda, sağdaki gibi ve sol parametre, double türünde bir değişkendir.

Yani, sonunda konu, yazma işlemini (örtük dahil) aşırı yükleme olasılığını, yani bir yöntem çağrısının bağlamını belirleme ve beklenen dönüş değerinin türüne bağlı olarak mql'ye sokma arzusuna indirgenir. bu bağlamda istediğiniz kodu çağırın. Ve bağlam açıkça tanımlanmadıysa, bir hata atın.