2009-04-13 7 views
2

저는 메타 클래스가 무엇인지에 대해 조금 읽었습니다.하지만 C++에서 얻을 수 있는지 알고 싶습니다.C에서 메타 클래스를 구현하려면 어떻게해야합니까?

Qt 라이브러리가 MetaObjects를 사용하고 있지만,이를 달성하기 위해 C++ 확장을 사용한다는 것을 알고 있습니다. C++에서 직접 가능한지 알고 싶습니다.

감사합니다.

답변

1

메타 클래스를 만들 수는 있지만 C++은 그것에 관한 것이 아니라 정적으로 컴파일 타임 기반의 구현에 관한 것이지 런타임 유연성이 아닙니다.

메쏘드가있는 메타 클래스 나 데이터가있는 메타 클래스를 원한다면 데이터 클래스를 boost :: any와 같은 Boost 구조체로 구현할 수 있으며 메소드가있는 클래스가 필요하면 boost :: bind를 사용하여 메서드를 개체에 바인딩하거나 COM 개체와 같은 단일 진입 점 인터페이스를 사용하여 메서드를 직접 구현할 수 있습니다.

그러나 "실제"C++ 방식은 제네릭을 사용하여 최상의 성능을 위해 컴파일 타임에 모두 결정할 수 있습니다.

솔직히 말해서, 실제로는 런타임 유연성을 필요로하는 시스템을 거의 보았습니다. 대부분의 경우 객체가 태어나고 같은 클래스에서 사망하거나 또는 적어도 그들의 95 %를 소비하기에 충분합니다. 공장에서 나오면 평생을 하나의 반으로 삼습니다.

그래서 많은 경우 런타임 메타 클래스에 많은 돈을 지불합니다. 물론 더 나은 개발자 성능을 제공한다는 생각이 들지만 많은 경우에 코드의 각 라인은 하드웨어를 작성하는 데 걸린 시간보다 몇 억 배나 더 많은 하드웨어에서 실행됩니다. 따라서 컴파일 타임 및 런타임 클래스에 대해 전면적 인 대가를 지불하거나 임대를 생각하는 것으로 생각할 수 있습니다. 개인적으로 전 정면으로 돈을 지불하고 싶습니다.

3

감마 (Gamma) 등의 저서 "디자인 패턴"의 패턴 중 일부는 메타 클래스 개념과 비슷한 기능을 가지고 있습니다. "전략"패턴을 사용하면 생성시 객체 동작을 사용자 정의 할 수 있습니다. 글자 봉투 관용어는 또 다른 친밀한 성냥이다. 하지만 인터페이스를 클래스에 맞게 사용자 정의 할 수는 없습니다.

COM에서는 IDispatch 인터페이스를 사용하여 런타임에 메서드/특성을 개체에 동적으로 추가 할 수 있습니다. 그것은 표준 C++ 메소드 호출을 포기하는 것을 의미합니다. 모든 호출은 인덱스 또는 문자열 키를 사용자 maintaned 메서드/속성 테이블에 가져 오는 모든 메서드를 통해 동일한 메서드를 수행하며 모든 매개 변수는 개체의 배열로 전달되어야합니다.

이 두 가지 기술을 사용하면 메타 클래스의 유연성을 얻을 수 있지만 구문 상 장점이나 런타임/컴파일러 도움이 없기 때문에 훨씬 어려운 문제가됩니다.

데이브

1

두려워하지 ... 적어도 기본적으로.

메타 클래스를 사용하면 일반적으로 Java의 경우와 같이 클래스를 나타내는 런타임 객체가 있어야합니다.

C++에서 클래스에는 런타임 표현이 없습니다. 그들의 표출은 가상 테이블과 같은 것으로 발생합니다. 그러나 여러 가지면에서 그들은 모든 OOP가 접착제 코드처럼 거의 기능하는 C 함수처럼 작동합니다.

다른 말로는 메타 클래스로 구현하려는 많은 것들에 대한 OOP 패턴이 있습니다. 자신의 객체 시스템을 "시뮬레이션"할 수도 있습니다.

3

메타 클래스의 작업 정의의 경우, 제네릭 C에서 메타 클래스는 ++ "인스턴스화 자체가 클래스입니다 언어의 실체"

#include <iostream> 
using namespace std; 

template <typename T> 
class Meta { 
public: 
    Meta(const T&init) : mData(init) {} 
// ... 
private: 
    T mData; 

}; 

int main(int, char **) { 
    cout << "The size of Meta<double> is " << sizeof(Meta<double>) << endl ; 
    return 0; 
} 

가 antepenultimate 줄의 메타 <의 사용을 두 번 >가 강요 컴파일러는 <double> 클래스를 인스턴스화합니다. sizeof 연산자는 Meta에서 작동하므로 이것이 의미 론적 설탕이 아니며 클래스가 인스턴스화되었음을 보여줍니다. Meta 형식의 개체가 인스턴스화되지 않아도 프로그램이 완료됩니다.

3

C++ 메타 클래스 (Python/Objective-C 방식이 아님)는 기본적으로 지원되지 않지만 수동으로 메타 클래스의 동작을 모방 할 수 있습니다. 기본은 매우 간단합니다. 더 긴 수명 (Singleton, static object 또는 Construct On First Use Idiom)을 가진 여분의 클래스를 생성하여 해당 클래스를 생성하고 조작 할 수 있습니다. (Objective-C에서 메타 클래스는 일반적으로 '정적'멤버 변수, 메모리 할당/할당 해제 루틴 등을 포함합니다.

Qt가 한 것은 메타 클래스 개념을 취하여 어떤 형식의 Reflection (그리고 그것을 지원하지 않는 시스템의 RTTI)을 지원할 수 있도록 수정 한 것입니다. 이를 구현하려면 매크로 마술이나 커스텀 컴파일러 (예 : 사용하기로 결정한 매크로)가 필요합니다.

일반적으로 일반적인 메타 클래스가 제공하는 대부분의 기능은 이미 C++ 언어에서 제공됩니다. 다른 형태로. 그리고 정말로, 당신이 메타 객체를 반사 목적으로 사용하는 유일한 이유는, this document에 개략적으로 설명 된 것처럼 C++에서 리플렉션을 구현하는 다른 방법이 있습니다.

그 외에도 Objective-C 스타일의 메타 클래스 시스템에 실제로 설정되어 있다면 그 라이브러리를 인식하지 못하고 있지만 실제로 잘 될 수도 있습니다. 반면에, 자신의 롤링도 그렇게 어려운해서는 안됩니다.

관련 문제