타자에 대한 질문

 

친애하는 프로그래머 여러분, 저는 오랫동안 이 질문에 대해 머리를 긁적였습니다. 어떻게든 함수의 반환 값을 암시적으로 입력하고 만들 수 있습니까? 메소드 호출이 외부적으로 동일할 때 클래스 메소드 가 다른 유형의 값을 리턴하는 경우.

 void OnStart ()
 {
  CParameter p1 = Ask , p2 = Bid , p3 = TimeCurrent (), p4 = TimeLocal ();
  
   // Перегруженный в CParameter оператор ~ возвращает преобразованное в строку значение известного объекту типа
  
   printf ( "p1=%s, p2=%s, p3=%s, p4=%s" , ~p1, ~p2, ~p3, ~p4 );
  
   // А можно ли исхитриться и сделать вот так (допустим это будет перегруженный тем или иным образом оператор !, возвращающий
   //   значение нужного типа в зависимости от type. 
   //
   // double ask = !p1, bid = !p2;
   // datetime current = !p3, local = !p4;  
 }  

이것은 수업 자체이며 질문이 명확하면 볼 수 없습니다.

 enum TYPE{ NUMBER, PRICE, TIME };

class CParameter
 {
public :
   template < typename T> void operator = ( T par )
   {
     if ( typename ( T ) == " double " )
     {
      data = int ( double ( par ) * 100000 );
      type = PRICE;
     }
     else
     {
       if ( typename ( T ) == " datetime " )
       {
        data = int ( uint ( par ) );
        type = TIME;
       }
       else
       {
        data = int ( par );
        type = NUMBER;
       }
     }
   }
   
   double to_price()
   {
     switch (type)
     {
       case PRICE: return double ( data ) / 100000 ;
       case TIME:   return MathArcsin ( 2.0 );
       default :     return double ( data );
     }
   }

   datetime to_time()
   {
     switch (type)
     {
       case TIME:   return datetime ( data );
       default :     return 0 ;
     }
   }

   int to_number()
   {
     switch (type)
     {
       case PRICE: return int ( double ( data ) / 100000 );
       case TIME:   return 0 ;
       default :     return data;
     }
   }
   
   string to_string()
   {
     switch (type)
     {
       case PRICE: return DoubleToString ( to_price(), 5 );
       case TIME:   return TimeToString ( to_time(), TIME_DATE | TIME_SECONDS );
       default :     return IntegerToString ( data );
     }
   }
   
   string operator ~ ()
   {
     return to_string();
   }
   
private :
   int data;
  TYPE type;
 };
 

할당할 때 switch를 제거하고 오버로딩을 활용할 수도 있습니다.

   void operator =( double par){
      data = int ( double (par)* 100000 );
      type = PRICE;
   }
   void operator =( datetime par){
      data= int ( uint (par));
      type=TIME;
   }
   void operator =( int par){   
      data = int (par);
      type = NUMBER;
   }

그런 다음 반환된 값이 산술 연산에 사용될 경우(집중할 사항) 다음과 같습니다.

   string operator +( string par){
       return to_string()+par;
   }
   
   double operator +( double par){
       return to_price()+par;
   }   
   
   double operator +( int par){
       return to_number()+par;
   }  
 Print (p1+ 1 );
Print (p1+ 1.0 );
Print (p1+ "1" );

---

나 자신을 위한 것이라면 참조에 의한 매개변수를 통해 반환되는 오버로드된 함수를 만들 것입니다.

   void r( double & v){
      v=to_price();
   }
   void r( int & v){
      v=to_number();
   }   
   void r( string & v){
      v=to_string();
   }   
 
Dmitry Fedoseev :

할당할 때 switch를 제거하고 오버로딩을 활용할 수도 있습니다.

그런 다음 반환된 값이 산술 연산에 사용될 경우(집중할 사항) 다음과 같습니다.

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

드미트리 페도세예프 :

내가 참조에 의한 매개변수를 통한 반환으로 함수를 오버로드하게 만들었더라면.


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

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

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

 
void OnStart()
 {
  CParameter<double> p1 = Ask;
  CParameter<double> p2 = Bid;
  CParameter<datetime> p3 = TimeCurrent();
  CParameter<datetime> p4 = TimeLocal();
  
  // Перегруженный в CParameter оператор ~ возвращает преобразованное в строку значение известного объекту типа
  
  printf( "p1=%s, p2=%s, p3=%s, p4=%s", ~p1, ~p2, ~p3, ~p4 );
  
  // А можно ли исхитриться и сделать вот так (допустим это будет перегруженный тем или иным образом оператор !, возвращающий
  //   значение нужного типа в зависимости от type. 
  //
   double ask = !p1, bid = !p2;
   datetime current = !p3, local = !p4;  
 }  
template <typename T>
class CParameter
 {
public: 
  void operator =( const T Value )
  {
    this.data = Value;
  }

  string operator~( void) const
   {
    return((string)this.data);
   }
   
  T operator !( void ) const
  {
    return(this.data);
  }  
   
private:
  T data;
 };
 
fxsaber :

이 경우 p1에 p4의 값을 할당하지 않습니다(유형 변경 포함). 그러나 이것은 원칙적으로 가능해야 합니다. 또한 개체는 동일한 유형이어야 합니다.

글쎄, 또는 배열의 경우 - 하나의 기본을 가진 다른 유형의 객체이지만 배열 객체 자체에는 메서드가 있으며 반환 유형은 해당 인덱스가 있는 객체 유형에 따라 다릅니다.
 
비슷한 질문: 왜 메서드를 오버로드할 때(overloaded 메서드의 서명에서 ) 반환 형식은 나타나지 않고 매개 변수 형식만 나타납니다. 즉, 리턴 유형이 다른 두 개의 동일한 메소드를 정의할 수 없습니다. 왜 그런 제한이 있습니까? 요점은 무엇입니까? 동일한 매개 변수를 사용하여 반환 값의 유형에 따라 메서드를 오버로드하는 것이 불가능한 이유
 
Ilya Malev :

이 경우 p1에 p4의 값을 할당하지 않습니다(유형 변경 포함). 그러나 이것은 원칙적으로 가능해야 합니다. 또한 개체는 동일한 유형이어야 합니다.

글쎄, 또는 배열의 경우 - 하나의 기본을 가진 다른 유형의 객체이지만 배열 객체 자체에는 메서드가 있으며 반환 유형은 해당 인덱스가 있는 객체 유형에 따라 다릅니다.

https://www.mql5.com/ru/docs/constants/structures/mqlparam

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура входных параметров индикатора
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура входных параметров индикатора
  • www.mql5.com
каждого элемента этого массива указывает тип данных, передаваемых данным элементом. Сами значения параметров индикатора необходимо предварительно поместить в соответствующие поля каждого элемента (в...
 

예, 90%의 경우 4로 충분할 때 32바이트를 전송합니다. 일반적으로 이것은 분기의 문제가 아닙니다. 저는 순서에 관심이 있습니다. 설명에서 누군가가 다소 우아한 솔루션을 찾았을 수도 있습니다. 상황


추신 게다가, 질문은 다른 유형의 데이터를 하나의 객체/구조에 저장하는 것에 관한 것이 아닙니다.

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

메서드는 반환할 형식을 결정할 수 없습니다.

 
fxsaber :

메서드는 반환할 형식을 결정할 수 없습니다.

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

 
Ilya Malev :

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

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