Also wenn man ganz semantisch sein will kann eine Funktion maximal einen Wert zurückgeben, jedoch gibt es ein paar "tricks" wie man dies umgehen kann. Wenn man eine Funktion haben will welche mehr als einen integralen datentypen zurück gibt und das jedes mal so kann man einfach ein struct erstellen welches die benötigten daten beinhaltet und dies dann zurückgeben. Hat man jedoch eine funktion welche entweder einen oder einen anderen, jedoch nicht beide gleichzeitig zurückgibt, so empfiehlt es sich ein union zu verwenden, da ein union in solchen Fällen speichereffizienter ist als ein struct da ein union immer nur maximal so viel speicher belegt wie sein größter member. Hat man jedoch eine Funktion welche alterierende Datentypen hat so kann man, entweder, falls man die boost bibliothek verwendet ein boost::any zurückgeben, oder falls man kein boost verwendet einen void *
//Beispiel 1
struct koordinaten {
//struct ist in C++ der klasse ähnlich mit dem unterschied das alle member standardmäßig public sind
//C++ unterstützt keine C-Style structs
koordinaten(int x, int y) : _x(x), _y(y) {}
int _x;
int _y;
};
koordinaten x(int x, int y){
koordinaten temp(x, y);
return temp;
}
//Beispiel 2
union my_return_type {
koordinaten k;
int hoehe;
};
my_return_type x(int x, int y, int h){
my_return_type temp;
if(x == 0 && y == 0){
temp.hoehe = h;
}else {
temp.k._x = x;
temp.k._y = y;
}
return temp;
}
//Beispiel 3
void *x(int x){
int a = 10;
double b = 3.14;
std::string c = "";
switch(x){
case 1:
return (void *)&a;
break;
case 2:
return (void *)&b;
break;
case 3:
return (void *)&c;
break;
}