타자에 대한 질문 - 페이지 2

 
Ilya Malev :

즉, 당신은 내가 쓴 것을 반복했습니다. 문제는 할 수 있는지 없는지가 아니라 왜 할 수 없는지와 어떻게 우아하게 해결할 수 있는지였습니다.

변환을 위한 간단한 기능을 작성하고 메서드 내에서 스위치를 고문하지 않습니까?

더블 더블(CParameter<더블>)

문자열 문자열(CParameter<더블>)

다음을 사용하십시오.

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

단항 연산자를 사용할지 명명된 함수를 사용할지 여부의 차이점은 무엇입니까? 기능이 더 좋습니다. 연산자는 이미 의미론적 부하를 가지고 있으며 임의로 변경하는 것은 얼음이 아닙니다.

 
fxsaber :

유형 제어가 손실됩니다. 이러한 질문에 대한 답변은 C++ 리소스를 참조하세요. 꽤 자주 물어보시는 것 같아요.

글쎄, 적어도 나는 이것이 mql의 제한이 아니라 일반적으로 C ++의 기능이라는 것을 알아 냈고 그것에 감사드립니다. :)

 
그리고 오버로드된 연산자의 lparam을 특정 개체나 구조체에 바인딩하지 않고 연산자를 오버로드할 수 없는 것, 이것도 C++의 기능인가요?
 
Ilya Malev :

명시적 과부하 및 산술 작업으로 모든 것이 명확합니다. 예, 오버로드된 = 이 경우에는 분명히 더 성공적이었습니다. 올바르게 알아차렸을 뿐만 아니라 급하게 질문에 대한 예제를 작성했고 실제로 그것에 대해 생각하지 않았습니다(숫자는 int뿐만 아니라 char, uchar, short, ushort, uint, bool 및 color이므로 모든 것이 모호하지 않습니다))))))))


여기서 문제는 오버로드된 메서드 의 반환 유형이 개체의 내용에 따라 다르다는 것입니다.

예를 들어, 다중 유형 배열이 있습니다(여러 책이기 때문에 예제를 제공하지 않겠습니다). 그리고 물론 모든 배열에는 해당 인덱스가 있는 변수 값을 반환하는 인덱싱 작업 []이 있어야 합니다.

그러나 변수에는 다른 유형이 있습니다. datetime이 있을 수도 있고, 문자열일 수도 있고, 이 인덱스 아래에 일부 사용자 정의 유형일 수도 있습니다. 그리고 이상적으로는 []를 인덱싱할 때 반환된 값의 유형이 명시적으로 매개변수화할 필요 없이 해당 유형을 자동으로 생성하기를 바랍니다. 이전에는 var[(char)1], var[(short)1], var[(uint)1] 등 이 "문제"를 해결했습니다. 그러나 이 목발은 좋지 않습니다.

mqlparam 유형 구조의 배열을 사용하십시오.

 
Dmitry Fedoseev :

mqlparam 유형 구조의 배열입니다.

같은 방식으로 double, string 또는 long과 동일시할 수 없습니다.

MqlParam 파;

par.double_value = 묻다;

더블 d = 파; // '=' - 잘못된 연산 사용

 
Ilya Malev :

같은 방식으로 double, string 또는 long과 동일시할 수 없습니다.

MqlParam 파;

par.double_value = 묻다;

더블 d = 파; // '=' - 잘못된 연산 사용

유형을 보고 해당 필드를 적절하게 지정합니다. 그것은 비뚤어진 접근 방식처럼 보이며 여전히 완벽한 솔루션을 찾고 있습니다. 그러한 작업은 전혀 발생해서는 안됩니다.

 
Ilya Malev :
그리고 오버로드된 연산자를 특정 개체나 구조체에 바인딩하지 않고 오버로드 연산자를 사용할 수 없는 것도 C++의 기능인가요?

그들이 인터넷에 그것에 대해 쓴 내용은 다음과 같습니다.

반환 유형만 다를 경우 함수 오버로딩이 불가능합니다.

C++14 13.1/2 표준:

 

비슷한 질문에 대한 응답으로 웹에서 이것을 찾았습니다.

 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();


내가 이해하는 것처럼 캐스트 연산자 "연산자 T()"는 여기에 오버로드되어 있습니다. 즉, C ++에서는 이것이 최소한 가능하다는 것을 의미합니다. 그리고 mql에서는 내가 이해하기로는 아직 아닙니다.

 
Ilya Malev :
비슷한 질문: 왜 메서드를 오버로드할 때(overloaded 메서드의 서명에서 ) 반환 형식은 나타나지 않고 매개 변수 형식만 나타납니다. 즉, 리턴 유형이 다른 두 개의 동일한 메소드를 정의할 수 없습니다. 왜 그런 제한이 있습니까? 요점은 무엇입니까? 동일한 매개 변수를 사용하여 반환 값의 유형에 따라 메서드를 오버로드하는 것이 불가능한 이유

아마도 그 이유는 다음과 같습니다.

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

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

void start() {
   f();
}

어떤 함수를 호출해야 할까요?

 
pavlick_ :

아마도 그 이유는 다음과 같습니다.

어떤 함수를 호출해야 할까요?

아마도 컴파일 단계에서 템플릿 불일치 오류가 생성되어야 합니다.


하지만 배열 객체가 있는 상황에서

 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 ];

}

첫 번째 경우 Array[int]에 대한 호출이 = 연산의 왼쪽 매개변수로 사용되며 이중 변수가 아니고 두 번째 경우 오른쪽으로 호출되므로 이러한 오류가 발생하지 않아야 합니다. 왼쪽 매개변수는 double 유형의 변수입니다 .

즉, 결국 주제는 입력 작업(암시적 포함)을 오버로드하는 가능성을 mql에 도입하려는 욕구로 요약됩니다. 즉, 메서드 호출의 컨텍스트를 결정하고 예상되는 반환 값의 유형에 따라 이 컨텍스트에서 원하는 코드를 호출합니다. 컨텍스트가 명시적으로 정의되지 않은 경우 오류가 발생합니다.