Задать вопрос

Как в C++ наиболее удобно (компактно) назначить две переменных вызывая функцию один раз?

В Python я например имею:
def func(a, b):
	return (a, b)

(x, y) = func(1, 2) # x = 1, y = 2

а вот в С++ приходится делать намного сложнее:
int *func(int a, int b) {
	int res[2];
	res[0] = a;
	res[1] = b;
	return res;
}

// способ 1 (но мне нельзя вызывать функцию 2 раза!)
x = func(1, 2)[0];
y = func(1, 2)[1];

// способ 2
int *a = func(1, 2);
x = a[0];
y = a[1];
// 3 строки писать для такой фигни?!

Как можно сделать этих три строки более компактными? Удалить \n не считается:D
  • Вопрос задан
  • 3007 просмотров
Подписаться 5 Оценить Комментировать
Решения вопроса 3
@encyclopedist
Во-первых, ваш код неверен.
Массив res - локальный для функции func, и использование указателя на него после возврата из функции - неопределённое поведение. Вам просто везло, что код работает.

Что касается решений - самое близкое к коду на питоне - это использовать std::tie (появившийся в C++11):
std::pair<int, int> func()
{
    return std::make_pair(1, 2);
}

int x, y;
std::tie(x, y) = func();


Другой, наиболее общепринятый способ - в параметрах фунции передавать ссылки или указатели на переменные, в которые надо поместить ответ.
void func(int &res1, int & res2)
{
    res1 = 1;
    res2 = 2;
}

int x, y;
func(x, y);
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
void func(int& a, int& b) {
	a = 1;
	b = 2;    
}

func(x, y);
Ответ написан
Комментировать
@drozdVadym
Си:
void func(int *a, int *b) {
*a = 1;
*b = 2;
}

func(&x, &y);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@lookid
приходится делать намного сложнее
3 строки писать для такой фигни?!
Добро пожаловать в С++. А ты что думал? Наклепать скриптов и вторым Кармаком станешь?
https://github.com/vancegroup-mirrors/bullet-physi...
Вот тебе скалярное произведение векторов в ~1500 строк.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы