2014-07-23 2 views
1

복잡한 클래스를 내 클래스의 void* 포인터로 숨기고 컴파일 된 시간을 단축 할 수 있다는 것을 알았습니다. 이러한 클래스를 선언하는 전달은 유지하기가 너무 어렵습니다.매크로를 사용하여 void * 포인터를 음영 처리하는 메커니즘

매크로 사용은 때때로 작동하지만 때로는 작동하지 않는 경우가 있습니다. 누구든지 캐스트를 사용하여 변수를 그림자 처리하는 방법을 알고 있으므로 l-value을 얻을 수 있습니까? 저에게 l-value을 줄 수있는 암시 적 캐스트 연산자가있는 구조로 할 수있는 것이 있습니까? 내가 보지 못하는 이러한 문제를 처리하기위한 패러다임 적 방법이 있습니까?

struct K : CGAL::Exact_predicates_inexact_constructions_kernel {}; 
typedef CGAL::Delaunay_triangulation_2<K> Triangulation; 
typedef Triangulation::Vertex_handle Vertex_handle; 
#define Triangulation_Ptr (static_cast<Triangulation*>(this->Triangulation_Ptr)) 
void MyClass::cleanTriangulation() 
{ 
    delete Triangulation_Ptr;//works, this->Triangulation_Ptr is a void* 
} 
void MyClass::addToTriangulation(int idx, MyPoint l) 
{ 
    if (Triangulation_Ptr == nullptr) 
    { 
     Triangulation_Ptr = new Triangulation;// No a l-value, doesn't compile 
    } 
    //something, that adds a point 
} 
+0

더 나은 유형 안전성 (더 정확한 유형 정보)이 런타임 성능을 향상시키지 않습니까? –

+1

정비 선언문에 대한 유지 보수 문제가 무엇인지 잘 모르겠습니다. –

+0

@PengZhang 우리가 캐스팅 할 때 (또는 컴파일 할 수 없을 때) 컴파일러가 올바른 구조 정보를보기 때문에 중요하지 않습니다. – Mikhail

답변

1

많은 사람들이이 일을하지 말라고 권유하지만 나는 고통을 공유합니다. 컴파일 시간과는 별도로 typedef, 템플릿 및 매크로의 레이어를 신중하게 디자인하고 사용하면 기본 코드가 아닌 경우에도 비즈니스 논리를 훨씬 쉽게 이해할 수있는 코드를 생성 할 수 있습니다. 당신은 가끔 이상한 컴파일 오류에 스스로 빠져 있지만, 내 견해로는 신중하게 선택한 상황에서 그 노력이 가치가있다.

당신이하려는 것은 반드시 쉽게 달성 할 수있는 것은 아닙니다. 매크로를 사용하려는 경우 매크로를 사용하는 사람들이 게임 내용을 알고있는 방식으로 매크로에 플래그를 지정하려고합니다.

이 기능이 작동합니까?

#DEFINE Triangulation_Ptr (삼각 *) (& this-> Triangulation_Ptr) 문제의

일부는 이러한 포인터 - 투 - 회원 정말 일반 포인터와 동일하지있는 것입니다.

관련 문제