2010-03-02 4 views
3

typedef 목록과 개체 인스턴스 목록을 목록에서 생성하는 방법이나 방법을 찾고 있습니다. 이러한 매크로는 객체의 클래스 유형과 생성자 매개 변수를 정의합니다.C/C++ 매크로 : 하나의 매크로로 두 개의 코드 섹션을 생성하는 방법 (전 처리기 라이브러리 향상)

아래 코드는 (작동하지 않는) 코드처럼 보입니다. 해결해야 할 문제는 하나의 매크로 호출 목록에서 두 개의 다른 목록을 생성하는 방법입니다. 이 문제는 부스트 전 처리기 라이브러리 부분을 해결하는 것 같아요하지만 지금은 어떻게 붙일 수 있습니다. 당신이 C 매크로에서 루프를 확장합니다

///////////////////////////////////////////////////////////////////////////////// 
// MACRO-Definitions 
#define DEF_OBJECT_TYPE(name, class, contructor_params) \ 
    typedef class name ## type; 
    name ## type* name; 

#define DEF_OBJECT_RUN(name, class, contructor_params) \ 
    name ## type* name = new name ## type contructor_params; \ 

#define DEF_OBJECTS(definitions) \ 
    /* Type-Header */ \ 
    definitions \ 
    /* Type-Footer */ \ 
    /* Run-Header */ \ 
    definitions \ 
    /* Run-Footer */ 

#define OBJECT(name) (dynamic_cast<name ## type*>(name)) 

///////////////////////////////////////////////////////////////////////////////// 
// Object-Definitions 
DEF_OBJECTS(
    DEF_OBJECT(Object1, CClass1, ("par1")) 
    DEF_OBJECT(Object2, CClass2, ("par1", "par1")) 
) 

///////////////////////////////////////////////////////////////////////////////// 
// This shall be the result of the macro expansion 
// shall expand to: 
struct MyClass { 

    typedef class Object1type; 
    Object1type* Object1; 

    typedef class Object2type; 
    Object2type* Object2; 

    void Run(); 
} 

void MyClass::Init() { 
    Object1type* Object1 = new Object1type("par1"); 
    Object2type* Object2 = new Object2type("par1", "par2"); 
} 
// end of expansion 
///////////////////////////////////////////////////////////////////////////////// 

// I want to use these automatic created objects in this way: 
void MyClass::Run() { 
    OBJECT(Object1)->method_class1(1); 
    OBJECT(Object2)->method_class2(1,2); 
} 

답변

2

매크로 트릭 ...

, 당신은 (전처리와 함께, 당신은 또한 포함한 다른 트릭을 할 수있다 반복만큼 macroes이 필요합니다 재귀 적으로 파일을 만들지 만 인터페이스와 같은 매크로는 없습니다).

마커를 추가하고 마커를 종료했는데 실제로 필요한 것인지 잘 모르겠습니다.

매크로 이름을 작성하여 빈 끝 매크로 나 계속 매크로로 디스패치합니다.

수정 된 인터페이스와 최대 4 개의 개체를 사용하여 원하는대로 할 수 있습니다. 더 많은 객체에 대해 유사한 매크로를 추가하기 만하면됩니다.

#define TYPE_DEF_OBJECT(name, class, constructor_params) \ 
    typedef class name ## type; \ 
    name ## type* name; 

#define TYPE_DEF_END(name, class, constructor_params) 

#define TYPE4_OBJECT(name, class, constructor_params) \ 
    TYPE_DEF_OBJECT(name, class, constructor_params) TYPE5 
#define TYPE4_END(name, class, constructor_params) \ 
    TYPE_DEF_END(name, class, constructor_params) 
#define TYPE4(kind, name, class, constr) \ 
    TYPE4_##kind(name, class, constr) 

#define TYPE3_OBJECT(name, class, constructor_params) \ 
    TYPE_DEF_OBJECT(name, class, constructor_params) TYPE4 
#define TYPE3_END(name, class, constructor_params) \ 
    TYPE_DEF_END(name, class, constructor_params) 
#define TYPE3(kind, name, class, constr) \ 
    TYPE3_##kind(name, class, constr) 

#define TYPE2_OBJECT(name, class, constructor_params) \ 
    TYPE_DEF_OBJECT(name, class, constructor_params) TYPE3 
#define TYPE2_END(name, class, constructor_params) \ 
    TYPE_DEF_END(name, class, constructor_params) 
#define TYPE2(kind, name, class, constr) \ 
    TYPE2_##kind(name, class, constr) 

#define TYPE1_OBJECT(name, class, constructor_params) \ 
    TYPE_DEF_OBJECT(name, class, constructor_params) TYPE2 
#define TYPE1_END(name, class, constructor_params) \ 
    TYPE_DEF_END(name, class, constructor_params) 
#define TYPE1(kind, name, class, constr) \ 
    TYPE1_##kind(name, class, constr) 

#define TYPE0_OBJECT(name, class, constructor_params) \ 
    TYPE_DEF_OBJECT(name, class, constructor_params) TYPE1 
#define TYPE0_END(name, class, constructor_params) \ 
    TYPE_DEF_END(name, class, constructor_params) 
#define TYPE(kind, name, class, constr) \ 
    TYPE0_##kind(name, class, constr) 


#define RUN_DEF_OBJECT(name, class, constructor_params) \ 
    name ## type* name = new name##type constructor_params; 

#define RUN_DEF_END(name, class, constructor_params) 

#define RUN4_OBJECT(name, class, constructor_params) \ 
    RUN_DEF_OBJECT(name, class, constructor_params) RUN5 
#define RUN4_END(name, class, constructor_params) \ 
    RUN_DEF_END(name, class, constructor_params) 
#define RUN4(kind, name, class, constr) \ 
    RUN4_##kind(name, class, constr) 

#define RUN3_OBJECT(name, class, constructor_params) \ 
    RUN_DEF_OBJECT(name, class, constructor_params) RUN4 
#define RUN3_END(name, class, constructor_params) \ 
    RUN_DEF_END(name, class, constructor_params) 
#define RUN3(kind, name, class, constr) \ 
    RUN3_##kind(name, class, constr) 

#define RUN2_OBJECT(name, class, constructor_params) \ 
    RUN_DEF_OBJECT(name, class, constructor_params) RUN3 
#define RUN2_END(name, class, constructor_params) \ 
    RUN_DEF_END(name, class, constructor_params) 
#define RUN2(kind, name, class, constr) \ 
    RUN2_##kind(name, class, constr) 

#define RUN1_OBJECT(name, class, constructor_params) \ 
    RUN_DEF_OBJECT(name, class, constructor_params) RUN2 
#define RUN1_END(name, class, constructor_params) \ 
    RUN_DEF_END(name, class, constructor_params) 
#define RUN1(kind, name, class, constr) \ 
    RUN1_##kind(name, class, constr) 

#define RUN0_OBJECT(name, class, constructor_params) \ 
    RUN_DEF_OBJECT(name, class, constructor_params) RUN1 
#define RUN0_END(name, class, constructor_params) \ 
    RUN_DEF_END(name, class, constructor_params) 
#define RUN(kind, name, class, constr) \ 
    RUN0_##kind(name, class, constr) 

#define DEF_OBJECTS(definitions) \ 
    TYPE definitions \ 
    RUN definitions \ 

DEF_OBJECTS(
    (OBJECT, Object1, CClass1, ("par1")) 
    (END, , ,) 
) 
+0

빠른 해결책을 제공해 주셔서 감사합니다. TYPE0_DEF, TYPE1_DEF 등의 생성. 매크로는 이음새가 boost-preprocessor-library의 후보가됩니다. 나는 이것을 최대한 빨리 시도 할 것이다. 다시 한번 감사드립니다. – Marcel