2012-03-05 4 views
0

런타임에서 (런타임 중에) 함수에서 반환 할 유형을 어떻게 결정할 수 있습니까?
전혀 가능합니까?
나는 그것이 하나라고 확신 할 수 없다고 생각합니다.다른 유형의 반환

+1

은 다형성 (polymorphism)을 사용한다. (물론 이것은 사용자 정의 된 타입에서만 작동 할 것입니다.) 대신에 객체 타입을 반환하도록 메소드를 선언 할 수는 있지만 매우 우아하지는 않습니다. – scibuff

+0

일부 제한된 경우에, '노동 조합 '(무언가를 제공하는 것이 그것을 차별 함). 일반적으로 다형성이 좋습니다. –

+0

@scibuff : 답변으로 게시해야합니다. –

답변

-3

사용 다형성

public interface MyType { 
    public void doSomething(); 
} 

public class A implements MyType { 
    public void doSomething(){} 
} 

public class B implements MyType { 
    public void doSomething(){} 
} 

public class MyClass { 

    public MyType getData(){ 
     if (/* some condition */){ return new A(); } 
     return new B(); 
    } 

    public void test(){ 
     MyType o = this.getData(); 
     o.doSomething(); 
    } 
} 

단순히 유형 MyType의 반환하고 그 객체에 직접 doSomething() 전화; 즉, 반환 된 유형이 A 또는 B인지 여부를 알 필요가 없습니다. 당신이 신경 쓰는 것은 그것이 doSomething을 구현한다는 것입니다. 부스트를 사용하는 옵션 인 경우 즉, 다형성의 아름다움, 즉 더 이상 추한 is, getType, instanceOf (자바) 등

+2

잘못된, 그것은 C에 대한 자바 대답에게있어 ++ 질문, 정말 대답 템플릿 OP에 적용 할 수없는 대안에 대한 제안. 태그를보십시오. –

+0

이 예제는 Java이며 질문은 C++에 관한 것입니다. C++에서 기본적으로 동일한 작업을 수행 할 수 있습니다. 사용자 정의 유형 만 신경 쓰면됩니다. C++에서 할 수없는 일은 C++이 모든 클래스를 공통 루트 유형에서 상속하도록 자동으로 강제하지 않기 때문에'Object'를 반환하는 것입니다. – bames53

+1

@Jacobo 당신은 진지한가 ??? C++, C#, Java, PHP 등의 언어가 무엇이든 상관하지 않습니다. – scibuff

3

입니다 Boost.Variant을 사용하는 것이 좋습니다.

변종을 union으로 스테로이드로 생각할 수 있습니다. 대부분의 C++ 유형과 호환되며 컴파일 타임 및 런타임 다형성을 모두 허용하지만 유형에 공통 기본 클래스가 필요하지 않습니다. 주요 단점은 심각한 양의 템플릿 메타 프로그래밍을 포함하므로 컴파일러에 약간의 부하가 걸릴 것이라는 점입니다. ,

typedef boost::variant<float, std::string> MyVariant; 

MyVariant GetInt() { return MyVariant(42); } 
MyVariant GetString() { return MyVariant("foo"); } 

MyVariant v; 
//run-time polymorphism: 
int number = boost::get<int>(v); // this line may throw (basically a dynamic_cast) 

//compile time polymorphism: 
boost::apply_visitor(Visitor(), v); 
// where Visitor is a functor overloading operator() for *all* types in the variant 

더 경량 대안 Boost.Any있는 비교를 위해 this page를 참조하십시오

여기에 아이디어를 얻을 수있는 간단한 예입니다.

+0

Boost.Any는 형식 지우기가 포함되어 있으므로 훨씬 더 많은 중량이 필요합니다. 그러나 Boost.Variant를 권유 한 +1. – ildjarn

+0

가벼운 무게는 아마도 나쁜 단어였습니다. 제가 말하고자하는 것은 Any가 Variant보다 배우고 사용하기가 더 쉽다는 것입니다. 혼란을 드려 죄송합니다. – ComicSansMS

관련 문제