2010-11-22 3 views
2

[이 질문에 대한 후속 조치 : C++에서 해당 유형의 객체를 인스턴스화 할 수 있습니까?C++에서 "형식"을 전달할 수 있습니까?

Java에서는 클래스 유형의 메소드 매개 변수를 사용할 수 있으며 호출자는 Foo.class를 전달할 수 있습니다. 나는이 aspect reflection을 고려하지 않았습니다, 당신이 전달 된 클래스로 할 수있는 것이 분명합니다. C++에는 "형식"을 전달하는 메커니즘이 있습니까? 내가 그 유형을 통과 할 수있는 것이 거의 없거나 거의 없다는 것을 알고 있기 때문에 나는 그 대답이 "아니오"라고 생각합니다.

분명히 템플릿은이 기능을 제공하지만 필자가 원하는 것은 아닙니다.

+0

이 유형의 개체로 무엇을 하시겠습니까? –

답변

0

아니요.이 기능은 "리플렉션"의 일부로 컴파일 된 이진 파일에 클래스에 대한 정보를 실제로 넣는 Java와 같은 언어에서만 가능합니다.

C++ (일반적으로)는 결과 바이너리에 클래스에 대한 정보를 실제로 저장하지 않습니다. (std::type_info이 작동하는 데 필요한 몇 비트 제외)

실제로 Java와 C++에서 제공되는 친구가 제공하는 "유형"과 같은 것은 없으므로 메서드에 전달할 수 없습니다. 당신이 그것을 인스턴스화의 목적하는 방법에 유형을 전달하려는 경우

, 당신은 실제로

#include <memory> 

struct IMyType 
{ 
    virtual ~IMyType(); 
    virtual MyMethod(); 
}; 

struct IElementFactory 
{ 
    virtual std::auto_ptr<IMyType> GetNewItem() const = 0; 
    virtual ~IElementFactory(); 
}; 


void MyMethodThatAcceptsAType(const IElementFactory& factory) 
{ 
    std::auto_ptr<IMyType> instance(factory.GetNewItem()); 
    //Use your instance like normal. 
} 

이 더 나은 것입니다 (이 너무 Java 및 친구와 함께 작동) 더 나은 방법으로이 작업을 수행 할 수 있습니다 왜냐하면이 코드는 타입 기반의 안전성을 유지하고 반성 기반 코드는 유지하지 않기 때문입니다.

+0

그래서 type_info는 C++에서 사용하는 것과 거의 비슷합니까? (그다지 가까와하지 않습니다 :-)) – Greencpp

+0

@ 그린 립 : 잊어 버렸습니다. 그러나'std :: type_info'는 특정 인스턴스 변수의 가장 많이 파생 된 이름을 결정하는 것 외에는 쓸모가 없습니다. Java 및 친구 언어의 "유형"이 제공하는 것과 거의 유사하지 않습니다. –

+0

@Greencpp : 오류, 당신의 의견을 잘못 읽었습니다. 네,'type_info' (그리고 확장자'dynamic_cast')는 C++에서 발견 된 유일한 반사와 같은 특징입니다. –

3

RTTI (런타임 유형 식별)와 같은 사운드가 사용자가 원하는 것입니다. http://en.wikibooks.org/wiki/C++_Programming/RTTI에서 :

유형 ID 연산자, 런타임 객체의 클래스를 결정하는 데 사용된다. 은 std :: type_info 개체에 대한 참조를 반환합니다.이 개체는 프로그램이 끝날 때까지 에 있으며 은 "개체"를 설명합니다.

+0

+1 내 대답에 내 첫 번째 개정판에'type_info'에 대해 잊어 버렸습니다. :) –

관련 문제