返回不同的类型

时间:2012-03-05 11:51:41

标签: c++ c++11

我如何(在运行时)决定从我的函数返回哪种类型?
这有可能吗?
我认为这是永远无法确定的。

2 个答案:

答案 0 :(得分:3)

如果选择使用Boost,请考虑使用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进行比较。

答案 1 :(得分:-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。这就是多态的美,即不再丑陋isgetTypeinstanceOf(Java)等。