Я знаю, что std::tuple
является допустимым способом возврата нескольких переменных разных типов из функции, как указано в a talk by Herb Sutter примерно в 1:31:00 (Этот пример кода - мой, а не из видео)C++ Возвращаемые множественные значения с помощью Struct
auto get_tuple()
{
return std::make_tuple(1, 2);
}
затем "распаковывать" это либо
auto t = get_tuple();
int a = std::get<0>(t);
int b = std::get<1>(t);
или
int a;
int b;
std::tie(a, b) = get_tuple();
Эти методы отличные, но мне не особенно нравится синтаксис std::get
или std::tie
. Я бы не стал использовать полезный инструмент только из-за уродливого синтаксиса (по моему личному мнению), но как насчет этого?
auto get_struct()
{
struct R
{
int a;
int b;
}
return R{1, 2};
}
Это компилируется для меня (Visual Studio 2015), и мне больше нравится его синтаксис. Я не хочу, чтобы меня обвиняли в преждевременной оптимизации, но я также упомянул, что это во много раз быстрее, чем кортеж. В основном мне нравится синтаксис.
Тем не менее, я знаю, что только потому, что компиляция не означает, что язык предназначен для использования таким образом. Я не совсем уверен, как сформулировать этот вопрос, но в основном, это действительное и определенное поведение? Могу ли я быть уверенным, что это будет работать на других крупных компиляторах? Честно говоря, я был довольно удивлен, что он будет выводить тип, даже если этот тип определен в самой функции, поэтому я хочу убедиться, что все в порядке.
Это первый раз, когда я действительно опубликовал этот сайт, поэтому извините заранее, если я сделал что-то не так. Пожалуйста, дайте мне знать, если я это сделал.
EDIT: Как указано в ответах, мое утверждение о том, что локальная структура во много раз быстрее, чем кортеж, совершенно неверна. Я не делал свой тест должным образом. См. Ответы для большего, я просто хотел изменить это, чтобы убедиться, что я никого не вводит в заблуждение.
Я согласен с ниже ответ, имеющие классы вместо встроенного в типах, вероятно, будет иметь значение с точки зрения производительности. Я хотел бы получить аргументы типа 'void get_tuple (int & out1, int &out2);' или даже более общий 'void get_values (std :: vector & values); '- этот способ может получить любое количество значений. –
Alex
Вы уверен, что вы не измеряете его в режиме отладки? С включенной оптимизацией кортежи не должны заметно замедляться. – SergeyA
Что вы подразумеваете под словом «кажется, что это во много раз быстрее, чем кортеж». Что такое «это»? – Barry