2010-08-19 4 views
8

C++ 클래스의 각 메소드에 대한 포인터 목록 (예 : 배열)을 만들 수 있습니까?클래스의 메소드 목록 가져 오기

.NET Framework에서는 Type.GetMethods()과 같지만 표준 C++ 만 사용합니다.

+7

회원님이 손으로 그것을하지 않으면. 그리고 그것은 무서운 것이 필요합니다. 왜? – GManNickG

+0

@Gman : "무서운 것이 필요합니다"에 대해 –

+0

@GManNickG 클래스의 구문 분석 트리를 생성하여 C++ 클래스의 메서드 목록을 생성 할 수없는 이유는 무엇입니까? –

답변

6

일반적인 방법으로는 불가능합니다. C++에는 .NET과 동일한 메타 데이터 인프라가 없습니다.

이 정보를 사용하고자하는 시나리오를 제공해 주시겠습니까? C++에서 사용할 수있는 더 나은 방법이있을 수 있습니다.

+0

지금까지는 호기심에서 벗어났습니다.저는 어제 JSON 데이터를 다루는 일종의 라이브러리에 대해 생각하고 있었지만, 오늘날이 접근 방식에 대해 생각한 이유를 기억하지 못합니다. 아직도 질문이 남아 있으므로 물었다. –

+1

구문이 유사하더라도 언어가 얼마나 다른지를 보여주는 좋은 예입니다. 문제를 해결하는 방법의 정신은 두 언어간에 완전히 다릅니다. – tenfour

2

.h 파일의 복사본을 만들어 편집기에서 해킹하십시오.

아니요, 자동으로 수행 할 방법이 없습니다.

0

C++ 개체 및 클래스에는 메타 클래스가 없으므로 반영 할 수 없으므로 대답은 아니오입니다.

0

typeid을 사용하여 유형 정보를 얻을 수 있지만 방법 정보는 얻을 수 없습니다.

3

방법이 없습니다.

실제로 개체 코드 수준에서도 정적 클래스 멤버 함수는 독립 실행 형 함수와 구별 될 수 없으며 독립 실행 형 함수의 클래스 인스턴스 함수가 ​​개체에 대한 포인터를 전달할 수도 없습니다.

컴파일러 이름 변환 체계를 알고 있고 미리 링크 된 오브젝트 코드에 액세스 할 수 있다면이를 디코드 할 수는 있지만 iffy 결과를 위해서는 많은 작업이 필요합니다.

+1

+1 하드 코어 "get 'er done"접근법. – tenfour

1

당신은 정말 제임스 Coplien에 의해 고급 C++ 프로그래밍 스타일 및 숙어의 8 장,이 작업을 수행 할 수 (아마 긴 이후 절판,하지만 난 닐 싸게 자신의 사본을 판매 기꺼이 듣고)하는 경우 C++에서 "exemplars"로 프로그래밍하는 것을 다룹니다. 실수하지 마십시오. 기능이 무료로 제공되지는 않지만 C++에서 메타 클래스와 비슷한 기능을 제공 할 수 있습니다.

나는 그의 건물을 자신의 수업 중 하나에 담아 특정 능력을 기억하지 못하지만, 그 책을주의 깊게 읽은 이후로 오랜 시간이 걸렸습니다. 항상 가능합니다. 전혀 수행 할 수 없지만 그가 공개 한 내용의 다른 제한 사항을 준수 할 수만 있다면 작동 할 것입니다.

2

내 프로젝트에서는 클래스 멤버 선언 및 정의를 위해 특수 매크로를 사용하고 클래스 멤버 목록을 얻을 수 있습니다.

클래스 선언 :

#define DECLARE_MODULE_FUNCTION(function_name) \ 
JsonObject function_name(JsonObject value); 

#define DEFINE_MODULE_FUNCTION(function_name) \ 
static ModuleFunctionAdder<LotteryOddsModule> \ 
__LINE__##function_name(L ## #function_name , &LotteryOddsModule::function_name); \ 
JsonObject LotteryOddsModule::function_name(JsonObject value) 

template< typename T > 
class ModuleFunctionAdder; 

class LotteryOddsModule 
{ 
public: 
    typedef JsonObject (LotteryOddsModule::*ModuleFunction)(JsonObject); 

    JsonValue Invoke(JsonValue json_value); 

    DECLARE_MODULE_FUNCTION(GenerateK1AndK2); 

private: 
    friend class ModuleFunctionAdder<LotteryOddsModule>; 
    static std::map< WString , ModuleFunction > _module_functions; 
}; 

template<> 
class ModuleFunctionAdder<LotteryOddsModule> 
{ 
public: 
    ModuleFunctionAdder(WString func_name , LotteryOddsModule::ModuleFunction func) 
    { 
     LotteryOddsModule::_module_functions[ func_name ] = func; 
    } 
}; 

클래스 정의 : 예를 들어

JsonValue LotteryOddsModule::Invoke(JsonValue json_value) 
{ 
    return (this->*_module_functions[ L"GenerateK1AndK2" ]) (json_value.get_obj()); 
} 

DEFINE_MODULE_FUNCTION(GenerateK1AndK2) 
{ 
    //... 
} 
관련 문제