템플릿 매개변수가 있는 컴파일러 버그 = void* - 페이지 5

 
Igor Makanu :

문자열을 통해서만 다음과 같이 StringConcatenate()를 통해 포인터의 주소를 가져오곤 했습니다.

StringConcatenate 에 대해 몰랐는데 MT5에서 다시 실행되어 더 이상 string s 없이 사용할 수 없다는 것이 유감입니다. 그리고 네 번째에는 StringFormat이 눈에 띄게 빨라집니다.

그리고 일반적으로 어떤 이유로 상위 5개에서 문자열을 통해 포인터를 "단순화"하는 이 작업은 거의 두 배 느립니다. 기본적으로 모든 것이 더 빠르게 작동하지만 때로는 몇 배 정도 더 느립니다.
 
fxsaber :

괄호는 표현의 해석에 있어 완전한 모호성을 제공합니다.

지능적인 프로그래머에게 모든 것이 이미 모호하지 않은데 왜 이 추가적 명확성이 있습니까? 그리고 "친절한 컴파일러"의 정신으로 계속한다면 if의 모든 표현식을 중괄호로 묶도록 요구해야 합니다. 그렇지 않으면 어리석은 프로그래머가 뭔가를 혼동할 것입니다.

우리가 더 큰 명확성에 대해 이야기하고 있다면 공백을 넣는 것으로 충분합니다.

a<< 1 | b<< 2 | c<< 3
 
pavlick_ :

솔직히 말해서 그러한 어레이의 의심스러운 이점. 그것으로 무엇을 할 수 있습니까? 배열 구성원에 대해 삭제가 자동으로 호출되지 않는다는 것을 알고 계십니까?

어때요? 객체 소멸자는 항상 가상입니다.
 
Alexey Navoykov :
어때요? 객체 소멸자는 항상 가상입니다.

그리고 당신은 시도합니다. void*의 경우에는 기회가 전혀 없습니다.

 

delete는 누구에게도 자동으로 호출되지 않습니다. 그래서 삭제입니다)

또 다른 것은 이것이 배열 자체의 소멸자에서 어떤 식으로든 간섭하지 않고 목록을 살펴보고 필요한 경우 모든 객체를 제거한다는 것입니다.

여러 가지 이유로 공통 기본 유형을 사용하고 이에 대한 참조를 유지하는 것이 더 유리하지만
 

CArayObject를 덤프로 보내려면 기본 클래스 위에 래퍼(예: https://www.mql5.com/en/forum/170952/page110#comment_9894796) 를 만들고 이를 배열(아마도 당신의 것)이지만 void*는 필요하지 않습니다.

나는 무효*에 반대하는 것이 아니라 필요하지만 다른 자격으로 필요합니다.

 
pavlick_ :

그리고 당신은 시도합니다. void*의 경우에는 기회가 전혀 없습니다.

예, 모든 것이 잘 작동합니다. 무엇을 발명하고 있습니까?

 class B
{
 public : 
  ~B() { Print ( __FUNCSIG__ ); }
};

class A
{
 public : 
  B b;
  ~A() { Print ( __FUNCSIG__ ); }
};

void OnStart ()
  {
   A* a= new A;
   
   void * p= a;
   delete p;
  }

로그에서 다음을 얻습니다.

무효 A::~A()
무효 B::~B()

그리고 내가 왜 이것에 빠졌는지...

 
Alexey Navoykov :

지능적인 프로그래머에게 모든 것이 이미 모호하지 않은데 왜 이 추가적 명확성이 있습니까? 그리고 "친절한 컴파일러"의 정신으로 계속한다면 if의 모든 표현식을 중괄호로 묶도록 요구해야 합니다. 그렇지 않으면 어리석은 프로그래머가 뭔가를 혼동할 것입니다.

우리가 더 큰 명확성에 대해 이야기하고 있다면 공백을 넣는 것으로 충분합니다.

공간에 대한 가시성은 아무 의미가 없습니다. 스타일리스트 의 세계에 오신 것을 환영합니다.

 
추가 정보 괄호
 class A
{
public :
   int i;
  
  A* GetPtr()
  {
     this .i = 1 ;
    
     return (& this );
  }
  
   void f()
  {
     Print ( this .i);
  }
};

class B : public A
{
public :
   void * GetPtr()
  {
     this .i = 2 ;
    
     return (& this );
  }
};

void g( A* a)
{
  a.f();
}

void OnStart ()
{    
  B* b = new B;
  
//   b.GetPtr().f(); // 'f' - member function not defined
  
  ((A*)b).GetPtr().f();   // 1
  ((A*)b.GetPtr()).f();   // 2
  ((A*) ( b.GetPtr() ) ).f(); // Доп. скобки, чтобы подчеркнуть, что именно имелось в виду, не полагаясь на приоритеты.

   delete b;
}
 
fxsaber :

공간에 대한 가시성은 아무 의미가 없습니다. 스타일리스트 의 세계에 오신 것을 환영합니다.

스타일리스트가 읽을 수 있는 코드에서 코드를 읽기 어렵게 만든다면 그러한 스타일리스트가 그에게 적합하지 않을 수 있습니까?

저에게 스타일러는 모든 규칙을 유연하게 사용자 지정할 수 있을 때만 좋습니다.

사유: