nieznany zwracany typ

0

Witam.

Czy jest mozliwosc zwrocenia w funkcji typu ktorego nie znamy przed jej wywolaniem, gdyż to co zwróci jest zależne od warunku? Odebrac mozna by przy pomocy auto, ale przed nazwa funkcji tak sie nie da, czy mozna to zrobic w inny sposob? Jesli nie to jakie polecacie rozwiazanie tego problemu?

? wybierz_typ()
{
int typ;

cin >> typ;
switch (typ)
{
case 1:
    {
	Pierwszy p1;
    return p1;
    }       
case 2:
	{
     Drugi d1;
     return d1; 
	}

}

}

0

A może konkretnie opisać jak chcesz to wykorzystać? Bo wygląda to dziwnie, bo przecież i tak musisz potem w kodzie wiedzieć jakiego typu są to obekty żeby na nich operować...
Jeśli są to "związane typy" tzn klasy z jakąś wspólną bazą to zwracaj wskaźnik/referencje na tą bazę a resztę załatw polimorfizmem.

0
  1. Oczywiście, że w C++ można zwracać różny typ z funkcji (o ile to template), np dla C++14:
template <typename T, typename U>
auto sum(T a, U b) {
  return a + b;
}

int main() {
	int int_sum = sum(5, 10);
	float float_sum = sum(1, 9.f);
	std::string string_sum = sum(std::string("ala "), sum(std::string("ma "), "kota"));
	std::cout << int_sum << std::endl;
	std::cout << float_sum << std::endl;
	std::cout << string_sum << std::endl;
	return 0;
}

W C++11 trzeba by napisać:

template <typename T, typename U>
auto sum(T a, U b) -> decltype(a + b) {
  return a + b;
}
  1. Nie rozumiesz co to jest dedukcja typów i jak to w ogóle działa (pobieżnie, bo w szczegółach raczej nikt tego nie ogarnia ; D).

  2. W przypadku swojego problemu użyj polimorfizmu.

0

Wygląda to na wzorzec projektowy "factory method"

0

W C++ każda funkcja musi mieć jasno określony zwracany typ. Jeśli chcesz to ograniczenie ominąć to możesz:

  1. Tak jak napisali panowie powyżej użyć interfejsów i polimorfizmu dynamicznego
  2. Zwrócić unię (a raczej strukturę unia + id typu) lub boost::variant
  3. Zwrócić boost::any

W zależności od potrzeb, fabryka i boost::variant są sensowne. boost::any nigdy nie zdarzyło mi się w kodzie produkcyjnym użyć, a o uniach zawierających typy złożone to lepiej nawet nie myśleć.

0

To co chcesz zrobic wyglada na prosty polimorfizm a nie jakies kombinacje:

#include <iostream>
using namespace std;

class Bazowa {
public:
  virtual void dupa() = 0;
};

class A : public Bazowa {
public:
  virtual void dupa() {
    cout << "dupa A" << endl;
  }
};

class B : public Bazowa {
public:
  virtual void dupa() {
    cout << "dupa B" << endl;
  }
};

int main() {
	cout << "Wybierz dupe (0/1)" << endl;
	int a;
	cin >> a;
	Bazowa* asd;
	if (a == 0)
	  asd = new A();
	else
	  asd = new B();
	
	asd->dupa();
	delete asd;
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1