C++ 클래스의 각 메소드에 대한 포인터 목록 (예 : 배열)을 만들 수 있습니까?클래스의 메소드 목록 가져 오기
.NET Framework에서는 Type.GetMethods()
과 같지만 표준 C++ 만 사용합니다.
C++ 클래스의 각 메소드에 대한 포인터 목록 (예 : 배열)을 만들 수 있습니까?클래스의 메소드 목록 가져 오기
.NET Framework에서는 Type.GetMethods()
과 같지만 표준 C++ 만 사용합니다.
일반적인 방법으로는 불가능합니다. C++에는 .NET과 동일한 메타 데이터 인프라가 없습니다.
이 정보를 사용하고자하는 시나리오를 제공해 주시겠습니까? C++에서 사용할 수있는 더 나은 방법이있을 수 있습니다.
지금까지는 호기심에서 벗어났습니다.저는 어제 JSON 데이터를 다루는 일종의 라이브러리에 대해 생각하고 있었지만, 오늘날이 접근 방식에 대해 생각한 이유를 기억하지 못합니다. 아직도 질문이 남아 있으므로 물었다. –
구문이 유사하더라도 언어가 얼마나 다른지를 보여주는 좋은 예입니다. 문제를 해결하는 방법의 정신은 두 언어간에 완전히 다릅니다. – tenfour
.h 파일의 복사본을 만들어 편집기에서 해킹하십시오.
아니요, 자동으로 수행 할 방법이 없습니다.
C++ 개체 및 클래스에는 메타 클래스가 없으므로 반영 할 수 없으므로 대답은 아니오입니다.
typeid을 사용하여 유형 정보를 얻을 수 있지만 방법 정보는 얻을 수 없습니다.
방법이 없습니다.
실제로 개체 코드 수준에서도 정적 클래스 멤버 함수는 독립 실행 형 함수와 구별 될 수 없으며 독립 실행 형 함수의 클래스 인스턴스 함수가 개체에 대한 포인터를 전달할 수도 없습니다.
컴파일러 이름 변환 체계를 알고 있고 미리 링크 된 오브젝트 코드에 액세스 할 수 있다면이를 디코드 할 수는 있지만 iffy 결과를 위해서는 많은 작업이 필요합니다.
+1 하드 코어 "get 'er done"접근법. – tenfour
당신은 정말 제임스 Coplien에 의해 고급 C++ 프로그래밍 스타일 및 숙어의 8 장,이 작업을 수행 할 수 (아마 긴 이후 절판,하지만 난 닐 싸게 자신의 사본을 판매 기꺼이 듣고)하는 경우 C++에서 "exemplars"로 프로그래밍하는 것을 다룹니다. 실수하지 마십시오. 기능이 무료로 제공되지는 않지만 C++에서 메타 클래스와 비슷한 기능을 제공 할 수 있습니다.
나는 그의 건물을 자신의 수업 중 하나에 담아 특정 능력을 기억하지 못하지만, 그 책을주의 깊게 읽은 이후로 오랜 시간이 걸렸습니다. 항상 가능합니다. 전혀 수행 할 수 없지만 그가 공개 한 내용의 다른 제한 사항을 준수 할 수만 있다면 작동 할 것입니다.
내 프로젝트에서는 클래스 멤버 선언 및 정의를 위해 특수 매크로를 사용하고 클래스 멤버 목록을 얻을 수 있습니다.
클래스 선언 :
#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)
{
//...
}
회원님이 손으로 그것을하지 않으면. 그리고 그것은 무서운 것이 필요합니다. 왜? – GManNickG
@Gman : "무서운 것이 필요합니다"에 대해 –
@GManNickG 클래스의 구문 분석 트리를 생성하여 C++ 클래스의 메서드 목록을 생성 할 수없는 이유는 무엇입니까? –