Здравствуйте, netch80, Вы писали:
ARK>>Это тоже верно, но я сейчас говорю про текущую ситуацию — с чистотой функций никто не заморачивается (очень зря), но деление все равно есть из-за псевдотипа void, не позволяющего работать однотипно с произвольными функциями.
N>А чем он так мешает? Ну, присвоить результат нельзя. Так и при не-void его присваивать необязательно.
Речь не о том, мешает или не мешает, а о том, что функции делятся на два мира — нельзя использовать void в обобщенном коде. Приводил же пример выше на псевдокоде. Де-факто void-функции — это ровно то же самое, что и в паскале "procedure".
N>>>2. Если уже говорить про подобные возможности, то надо вспоминать и возврат не одного значения из функции, а многих. В C++, считаем, есть (хоть и криво — ни один ABI это ещё не позволяет напрямую; std::pair, std::tuple приводят к возврату структуры через скрытый параметр — указатель), и можно использовать (да хоть монады на нём строить). В Паскале нет и не ожидается.
ARK>>Я не большой знаток C++
, но не помню, что в нем это "есть". Чтобы использовать пары и туплы для комбинирования, надо, чтобы их не только возвращали, но и принимали входными параметрами, разве нет? Или можно НАПРЯМУЮ сунуть тупл (2, "test") в функцию "void Func(int a, string b)", т.е. вызвать как "Func(myTuple);"?
N>Можно.
Не конпелируется что-то:
https://ideone.com/Q3TtwD
#include <iostream>
using namespace std;
void Func(int a, std::string b)
{
std::cout << a;
std::cout << b;
}
int main() {
Func(33, "test"); // работает
std::pair <int,std::string> myPair (33, "test");
Func(myPair); // не компилируется
return 0;
}
prog.cpp:14:13: error: cannot convert ‘std::pair<int, std::__cxx11::basic_string<char> >’ to ‘int’ for argument ‘1’ to ‘void Func(int, std::__cxx11::string)’
Func(myPair);
^
Что я делаю не так? Или всё же
не можно?
N>Даже в штатной библиотеке какой-нибудь std::map::insert принимает std::pair<> как аргумент.
Это и в паскале можно.