Возвращая разные типы - PullRequest
       4

Возвращая разные типы

0 голосов
/ 05 марта 2012

Как я мог (во время выполнения) решить, какой тип вернуть из моей функции?
Возможно ли это вообще?
Я думаю, что это так, но никогда нельзя быть уверенным.

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

Если опция 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, для сравнения см. на этой странице .

0 голосов
/ 05 марта 2012

Использовать полиморфизм

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 (Java) и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...