Есть как минимум три подхода.
Первый, как вы уже упомянули, - это вернуть значение с использованием параметра типа указателя.
Например,
#include <iostream>
int minmax( int x, int y, int *max )
{
int min = x;
*max = y;
if ( y < x )
{
min = y;
*max = x;
}
return min;
}
int main()
{
int min, max;
min = minmax( 20, 10, &max );
std::cout << "min = " << min << ", max = " << max << '\n';
}
Результат программы:
min = 10, max = 20
Здесь в программе переменная max
передается по ссылке в терминах C.
Второй подход - это передача по ссылке в терминах C ++. Например,
#include <iostream>
int minmax( int x, int y, int &max )
{
int min = x;
max = y;
if ( y < x )
{
min = y;
max = x;
}
return min;
}
int main()
{
int min, max;
min = minmax( 20, 10, max );
std::cout << "min = " << min << ", max = " << max << '\n';
}
Вывод программы такой же, как показано выше.
И вы действительно можете вернуть один объект, но составного типа, который содержит другие подобъекты. Например,
#include <iostream>
#include <utility>
std::pair<int, int> minmax( int x, int y )
{
return y < x ? std::pair<int, int>( y, x ) : std::pair<int, int>( x, y );
}
int main()
{
auto p = minmax( 20, 10 );
std::cout << "min = " << p.first << ", max = " << p.second << '\n';
}
Вывод программы такой же, как показано для первой демонстрационной программы.
Вместо стандартного шаблона класса std :: pair, который имеет два члена данных, вы можете использовать шаблон класса std::tuple
, если вы хотите вернуть более двух объектов. Или вы можете написать свой собственный составной тип (шаблон или не шаблон) в виде структуры или класса.
Например
#include <iostream>
#include <tuple>
std::tuple<int, int, int> get_sorted( int x, int y, int z )
{
if ( not ( y < x ) && not ( z < x ) )
{
return not ( z < y ) ? std::make_tuple( x, y, z )
: std::make_tuple( x, z, y );
}
else if ( not ( z < y ) )
{
return not ( z < x ) ? std::make_tuple( y, x, z )
: std::make_tuple( y, z, x );
}
else
{
return not ( y < x ) ? std::make_tuple( z, x, y )
: std::make_tuple( z, y, x );
}
}
int main()
{
auto t = get_sorted( 15, 10, 20 );
std::cout << "( " << std::get<0>( t )
<< ", " << std::get<1>( t )
<< ", " << std::get<2>( t )
<< " )\n";
}
Вывод программы:
( 10, 15, 20 )