Re[2]: return1, return2
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.01.24 04:53
Оценка:
Здравствуйте, diez_p, Вы писали:


_>в шарпах ref/out,

В шарпах, как и у всех — туплы. И destructuring assignment тоже есть.
(int, string, int*) MyFunc()
{
   return (5, "ssssss", malloc(...));
}

var (x, y, z) = MyFunc();
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: return1, return2
От: fk0 Россия https://fk0.name
Дата: 29.04.24 09:01
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Исторически сложилось, что функция возвращает одно значение. В return.


В одном значении может быть что-то, что хранит в себе юнион с типом, или коллекцию значений.
Даже в голом C можно вернуть структуру. И нет смысла избегать этого, более того: возврат структур
по-значению для компилятора легче в плане генерации оптимального кода, чем работа с указателями.
Просто на некоторых старинных рахитектурах возврат структуры по-значению требовал выкрутасов
с копированием на стеке и этого избегали. Сейчас везде как правило возврат структуры компилятором
преобразуется в ту же передачу по-ссылке (на структуру которая будет возвращена, и память под
которую аллоцирована на стеке вызывающей функции), но при этом отлично оптимизируется в регистры
при случае.

H>Почему не придумали типа такого?


H>
H>int/string/int*   MyFunc()
H>{
H>   int res1 = 5;
H>   string res2 = “ssssss”;
H>   int* res3 = (int*)malloc…;
H>   return1 res1;
H>   return2 res2;
H>   return3 res3;
H>}

H>Print(MyFunc()2);
H>int b = MyFunc()1 + 6;
H>



struct Eklmn { int x; char *y; float z; } my_func(...)
{
    ...
    if (...)
        return (struct Eklmn){.x = 100500};
    if (...)
        return (struct Eklmn){.y = "xaxaxa");
    ...
}

...
printf("%s", my_func(...).y);
int b = my_func(...).x + 6);
...



Если нужен std::variant, то можно сделать что-то вроде:


struct NedoVariant
{
    enum {
    VariantInt, VariantString, VariantFloat...
    } type;

    union {
        int x;
        const char *y;
        float z;
        ...
    };
};


Соответственно, устанавливаем/читаем поле type и другое соответствующее ему поле.
Re[3]: return1, return2
От: fk0 Россия https://fk0.name
Дата: 29.04.24 09:03
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Здравствуйте, velkin, Вы писали:


H>Городить отдельную структуру для каждой комбинации выходных типов — слишком накладно.


Проблема в том, что в убогих недоязыках отсутствует auto и шаблоны.
Re[5]: return1, return2
От: andrey.desman  
Дата: 08.05.24 15:32
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Да, и про классы я знаю. Городить класс вокруг каждой тяжелой функции — тоже не то


Зато именами полей они дают семантику, да и порядок знать не надо. С порядком вообще легко в лужу сесть, особенно если типы одинаковые.
В тех же плюсах в STL в новых классах перестали возвращать std::pair, и хорошо, что не начали возвращать туплы.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.