명시적 과부하 및 산술 작업으로 모든 것이 명확합니다. 예, 오버로드된 = 이 경우에는 분명히 더 성공적이었습니다. 올바르게 알아차렸을 뿐만 아니라 급하게 질문에 대한 예제를 작성했고 실제로 그것에 대해 생각하지 않았습니다(숫자는 int뿐만 아니라 char, uchar, short, ushort, uint, bool 및 color이므로 모든 것이 모호하지 않습니다))))))))
예를 들어, 다중 유형 배열이 있습니다(여러 책이기 때문에 예제를 제공하지 않겠습니다). 그리고 물론 모든 배열에는 해당 인덱스가 있는 변수 값을 반환하는 인덱싱 작업 []이 있어야 합니다.
그러나 변수에는 다른 유형이 있습니다. datetime이 있을 수도 있고, 문자열일 수도 있고, 이 인덱스 아래에 일부 사용자 정의 유형일 수도 있습니다. 그리고 이상적으로는 []를 인덱싱할 때 반환된 값의 유형이 명시적으로 매개변수화할 필요 없이 해당 유형을 자동으로 생성하기를 바랍니다. 이전에는 var[(char)1], var[(short)1], var[(uint)1] 등 이 "문제"를 해결했습니다. 그러나 이 목발은 좋지 않습니다.
Ilya Malev : 비슷한 질문: 왜 메서드를 오버로드할 때(overloaded 메서드의 서명에서 ) 반환 형식은 나타나지 않고 매개 변수 형식만 나타납니다. 즉, 리턴 유형이 다른 두 개의 동일한 메소드를 정의할 수 없습니다. 왜 그런 제한이 있습니까? 요점은 무엇입니까? 동일한 매개 변수를 사용하여 반환 값의 유형에 따라 메서드를 오버로드하는 것이 불가능한 이유
class Array{
public :
Array * operator [] ( int i){ id = i; returnGetPointer ( this ); }
doubleoperator []( int i){ id = i; return data[i]; }
Array * operator =( double d){ data[id]=d; return GetPointer( this ); }
private :
double data[ 10 ];
int id;
};
intOnStart (){
Array array;
double d= 123.456 ;
array[ 5 ]=d;
d=array[ 5 ];
}
첫 번째 경우 Array[int]에 대한 호출이 = 연산의 왼쪽 매개변수로 사용되며 이중 변수가 아니고 두 번째 경우 오른쪽으로 호출되므로 이러한 오류가 발생하지 않아야 합니다. 왼쪽 매개변수는 double 유형의 변수입니다 .
즉, 결국 주제는 입력 작업(암시적 포함)을 오버로드하는 가능성을 mql에 도입하려는 욕구로 요약됩니다. 즉, 메서드 호출의 컨텍스트를 결정하고 예상되는 반환 값의 유형에 따라 이 컨텍스트에서 원하는 코드를 호출합니다. 컨텍스트가 명시적으로 정의되지 않은 경우 오류가 발생합니다.
즉, 당신은 내가 쓴 것을 반복했습니다. 문제는 할 수 있는지 없는지가 아니라 왜 할 수 없는지와 어떻게 우아하게 해결할 수 있는지였습니다.
변환을 위한 간단한 기능을 작성하고 메서드 내에서 스위치를 고문하지 않습니까?
더블 더블(CParameter<더블>)
문자열 문자열(CParameter<더블>)
다음을 사용하십시오.
PrintFormat ("%s %s %f",String(param1),String(param2),Double(param1));
단항 연산자를 사용할지 명명된 함수를 사용할지 여부의 차이점은 무엇입니까? 기능이 더 좋습니다. 연산자는 이미 의미론적 부하를 가지고 있으며 임의로 변경하는 것은 얼음이 아닙니다.
유형 제어가 손실됩니다. 이러한 질문에 대한 답변은 C++ 리소스를 참조하세요. 꽤 자주 물어보시는 것 같아요.
글쎄, 적어도 나는 이것이 mql의 제한이 아니라 일반적으로 C ++의 기능이라는 것을 알아 냈고 그것에 감사드립니다. :)
명시적 과부하 및 산술 작업으로 모든 것이 명확합니다. 예, 오버로드된 = 이 경우에는 분명히 더 성공적이었습니다. 올바르게 알아차렸을 뿐만 아니라 급하게 질문에 대한 예제를 작성했고 실제로 그것에 대해 생각하지 않았습니다(숫자는 int뿐만 아니라 char, uchar, short, ushort, uint, bool 및 color이므로 모든 것이 모호하지 않습니다))))))))
여기서 문제는 오버로드된 메서드 의 반환 유형이 개체의 내용에 따라 다르다는 것입니다.
예를 들어, 다중 유형 배열이 있습니다(여러 책이기 때문에 예제를 제공하지 않겠습니다). 그리고 물론 모든 배열에는 해당 인덱스가 있는 변수 값을 반환하는 인덱싱 작업 []이 있어야 합니다.
그러나 변수에는 다른 유형이 있습니다. datetime이 있을 수도 있고, 문자열일 수도 있고, 이 인덱스 아래에 일부 사용자 정의 유형일 수도 있습니다. 그리고 이상적으로는 []를 인덱싱할 때 반환된 값의 유형이 명시적으로 매개변수화할 필요 없이 해당 유형을 자동으로 생성하기를 바랍니다. 이전에는 var[(char)1], var[(short)1], var[(uint)1] 등 이 "문제"를 해결했습니다. 그러나 이 목발은 좋지 않습니다.
mqlparam 유형 구조의 배열을 사용하십시오.
mqlparam 유형 구조의 배열입니다.
같은 방식으로 double, string 또는 long과 동일시할 수 없습니다.
MqlParam 파;
par.double_value = 묻다;
더블 d = 파; // '=' - 잘못된 연산 사용
같은 방식으로 double, string 또는 long과 동일시할 수 없습니다.
MqlParam 파;
par.double_value = 묻다;
더블 d = 파; // '=' - 잘못된 연산 사용
유형을 보고 해당 필드를 적절하게 지정합니다. 그것은 비뚤어진 접근 방식처럼 보이며 여전히 완벽한 솔루션을 찾고 있습니다. 그러한 작업은 전혀 발생해서는 안됩니다.
그리고 오버로드된 연산자를 특정 개체나 구조체에 바인딩하지 않고 오버로드 연산자를 사용할 수 없는 것도 C++의 기능인가요?
그들이 인터넷에 그것에 대해 쓴 내용은 다음과 같습니다.
반환 유형만 다를 경우 함수 오버로딩이 불가능합니다.
C++14 13.1/2 표준:
비슷한 질문에 대한 응답으로 웹에서 이것을 찾았습니다.
내가 이해하는 것처럼 캐스트 연산자 "연산자 T()"는 여기에 오버로드되어 있습니다. 즉, C ++에서는 이것이 최소한 가능하다는 것을 의미합니다. 그리고 mql에서는 내가 이해하기로는 아직 아닙니다.
비슷한 질문: 왜 메서드를 오버로드할 때(overloaded 메서드의 서명에서 ) 반환 형식은 나타나지 않고 매개 변수 형식만 나타납니다. 즉, 리턴 유형이 다른 두 개의 동일한 메소드를 정의할 수 없습니다. 왜 그런 제한이 있습니까? 요점은 무엇입니까? 동일한 매개 변수를 사용하여 반환 값의 유형에 따라 메서드를 오버로드하는 것이 불가능한 이유
아마도 그 이유는 다음과 같습니다.
어떤 함수를 호출해야 할까요?
아마도 그 이유는 다음과 같습니다.
어떤 함수를 호출해야 할까요?
아마도 컴파일 단계에서 템플릿 불일치 오류가 생성되어야 합니다.
하지만 배열 객체가 있는 상황에서
첫 번째 경우 Array[int]에 대한 호출이 = 연산의 왼쪽 매개변수로 사용되며 이중 변수가 아니고 두 번째 경우 오른쪽으로 호출되므로 이러한 오류가 발생하지 않아야 합니다. 왼쪽 매개변수는 double 유형의 변수입니다 .
즉, 결국 주제는 입력 작업(암시적 포함)을 오버로드하는 가능성을 mql에 도입하려는 욕구로 요약됩니다. 즉, 메서드 호출의 컨텍스트를 결정하고 예상되는 반환 값의 유형에 따라 이 컨텍스트에서 원하는 코드를 호출합니다. 컨텍스트가 명시적으로 정의되지 않은 경우 오류가 발생합니다.