Это C++17 плюс, что более важно, в случае со structured binding имеется неявная зависимость от порядка следования аргументов. Можно поменять местами аргументы в функции gather и забыть подправить функцию main, что приведет к тому что забиндится не то, что хотелось бы.
В C++14 добавили возможность автоматического вывода типа зачения возвращаемого функций. В качестве возвращаемых типов в том числе могут выступать анонимные типы:
auto foo() {
int x = 10;
int y = 20;
int z = 30;
struct {
int x;
int y;
int z;
} ret;
ret.x = x;
ret.y = y;
ret.z = z;
return ret;
}
void test()
{
auto r = foo();
assert( r.x == 10 );
assert( r.y == 20 );
assert( r.z == 30 );
}
live sample:
Выглядит полезно и удобно, однако напрягает бойлерплейт в виде обявления структуры и заполнения её полей. Но магия препроцессора ( реализацию см. в следующем live sample ) приходит на помощь и позволяет написать что-то типа такого:
auto foo() {
int x = 10;
int y = 20;
int z = 30;
RETURN_ANONYMOUS_STRUCT( x, y, z );
}
live sample:
Такие вот мысли возникли. Может кому покажется интересным и пригодится.
Здравствуйте, Voivoid, Вы писали:
V>В C++14 добавили возможность автоматического вывода типа зачения возвращаемого функций. В качестве возвращаемых типов в том числе могут выступать анонимные типы:
struct AA
{
int x,y,z;
};
auto foo() {
int x = 10;
int y = 20;
int z = 30;
return AA { x, y, z };
}
int main()
{
auto r = foo();
assert( r.x == 10 );
assert( r.y == 20 );
assert( r.z == 30 );
std::cout << "ok\n";
}
Re[2]: C++14 возврат множества значений из функции.
Не, ну это очевидное и всем известное решение. Минус в том, что несколько засоряется namespace и в том, что при будущих изменениях кроме кода возвращающей функции нужно еще и поправить поля структуры.
Здравствуйте, Voivoid, Вы писали: V>В C++14 добавили возможность автоматического вывода типа зачения возвращаемого функций. В качестве возвращаемых типов в том числе могут выступать анонимные типы:
Сначала стоит понять чего хотим.
Именованные кортежи ? (Named tuples)
Здравствуйте, Voivoid, Вы писали:
V>В C++14 добавили возможность автоматического вывода типа зачения возвращаемого функций. В качестве возвращаемых типов в том числе могут выступать анонимные типы:
V>
V>auto foo() {
V>
Я правильно помню, что эта функция не может не быть inline, если используется в двух и более cpp файлах? Или она рассматривается наравне с шаблонной?
И каждый день — без права на ошибку...
Re[2]: C++14 возврат множества значений из функции.
Здравствуйте, B0FEE664, Вы писали:
BFE>Я правильно помню, что эта функция не может не быть inline, если используется в двух и более cpp файлах? Или она рассматривается наравне с шаблонной?
Да, по идее при использовании в более чем одной единице трансляции функция должна быть объявлена как inline ( ну или везде должна быть в анонимном namespace )
Но что-то меня одолевают сомнения на тему того, нет ли тут нарушения ODR в случае с inline. Будет ли возвращаемый функцией анонимый тип считать одинаковым в разных единицах трансляции?
Здравствуйте, Voivoid, Вы писали:
V>В C++14 добавили возможность автоматического вывода типа зачения возвращаемого функций. В качестве возвращаемых типов в том числе могут выступать анонимные типы:
... V>Выглядит полезно и удобно, однако напрягает бойлерплейт в виде обявления структуры и заполнения её полей. Но магия препроцессора ( реализацию см. в следующем live sample ) приходит на помощь и позволяет написать что-то типа такого:
Я просто хочу вызвать функцию и обращаться к полученному множеству результатов по именам. Альтернатива в виде приседаний с функторами по мне так выглядит менее декларативно.
Re[3]: C++14 возврат множества значений из функции.
если ваша идея когда нибудь перейдет в стандарт и без бустовской магии, то замечательно
а пока что я лучше структурку заведу чем пол буста держать под рукой и терять время на компиляции
Re[3]: C++14 возврат множества значений из функции.
Здравствуйте, Voivoid, Вы писали:
V>Я просто хочу вызвать функцию и обращаться к полученному множеству результатов по именам. Альтернатива в виде приседаний с функторами по мне так выглядит менее декларативно.
Нет проблем. есть более декларативные языки.
Re[2]: C++14 возврат множества значений из функции.
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, kov_serg, Вы писали:
_>>Чем это существенно лучше такого кода? BFE>А есть простой способ такой код сделать методом класса?
Конечно же нет
struct A {
int x;
struct foo { int y,z;
void operator() (A* self) { y=self->x; z=10-y; }
};
};
...
A a[1];
a->x=3;
A::foo r; r(a);
cout<<a->x<<","<<r.y<<","<<r.z<<endl;
...
Re[4]: C++14 возврат множества значений из функции.
Здравствуйте, kov_serg, Вы писали:
BFE>>А есть простой способ такой код сделать методом класса? _>Конечно же нет
Так я и сам могу. Не лаконично и не красиво. Ничем не отличается от внешней функции.
И каждый день — без права на ошибку...
Re[5]: C++14 возврат множества значений из функции.
Здравствуйте, B0FEE664, Вы писали:
BFE>Так я и сам могу. Не лаконично и не красиво. Ничем не отличается от внешней функции.
А кто говорил что будет красиво и лаконично?
Меня больше интересует как вы собираетесь экспортивовать из библиотеки "auto foo()" ?
Re[6]: C++14 возврат множества значений из функции.
Здравствуйте, kov_serg, Вы писали:
BFE>>Так я и сам могу. Не лаконично и не красиво. Ничем не отличается от внешней функции. _>А кто говорил что будет красиво и лаконично?
Функция возвращающая auto красива, лаконична и может быть методом в отличии от функтора.
_>Меня больше интересует как вы собираетесь экспортивовать из библиотеки "auto foo()" ?
Динамические библиотеки ненавижу, не использую и вам не советую.
И каждый день — без права на ошибку...
Re[7]: C++14 возврат множества значений из функции.
Здравствуйте, B0FEE664, Вы писали:
BFE>Функция возвращающая auto красива, лаконична и может быть методом в отличии от функтора.
На вкус и цвет фломастеры разные. Важна не красота, а выразительность. Что-то не получается выразить имеющимся синтаксисом?
_>>Меня больше интересует как вы собираетесь экспортивовать из библиотеки "auto foo()" ? BFE>Динамические библиотеки ненавижу, не использую и вам не советую.
А статические?
Как пользователю функции foo понять какие поля присутствуют в возвращаемом значении?
Даже если список возвращаемых значений (по смысловой нагрузке) очевиден из очевиден из названия функции, конкретное их обозначения может быть не очевидным.
Например: my_map.insert( value ) возвращает поля iterator + is_new или pointer + old_value_replaced ?
Имхо, лучше уж замусорить namespace, но обьявить возвращаемую структуру явно, чем заставлять пользователя копаться в коде фенкции.
Если имена полей возвращаемых структур стандартизированы в "code style", но разные функции возвращают разные наборы полей (очевидные, из назначения функции),
то стоит их перечислить в коде явно. Добро пожаловать в named_tuple.
//namespace my_fields
{
NT_DEFINE_FIELD( int , a ) // Если поле может быть только фиксированного типа
NT_DEFINE_FIELD( double , b )
NT_DEFINE_FIELD( float , c )
NT_DEFINE_AUTO_FIELD( x ) // Если тип не определен.
NT_DEFINE_AUTO_FIELD( y )
NT_DEFINE_AUTO_FIELD( z )
}
auto foo()
{
// ....return my_fields::x(10)
& my_fields::y(20)
& my_fields::z(30)
& my_fields::a(40)
& my_fields::c(60)
;
}
...
auto xyz = foo();
assert( xyz.x==10 );
assert( xyz.y==20 );
assert( xyz.z==30 );
static_assert( (std::is_same_v<decltype(xyz.c), float> ), "check fixed type" );
static_assert( (std::is_same_v<decltype(xyz.x), decltype(10) > ), "check auto type" );
Re[8]: C++14 возврат множества значений из функции.
Здравствуйте, kov_serg, Вы писали:
BFE>>Функция возвращающая auto красива, лаконична и может быть методом в отличии от функтора. _> Важна не красота, а выразительность.
Выразительность бывает излишне многословна. Отчасти поэтому ввели auto.
_>Что-то не получается выразить имеющимся синтаксисом?
Однозначную связь между объектом и его "методом", если вы про функтор.
_>А статические?
Функцию auto foo() можно рассматривать как разновидность шаблонной функции. Причём тут статическая библиотека?
И каждый день — без права на ошибку...
Re[2]: C++14 возврат множества значений из функции.
Здравствуйте, Chorkov, Вы писали:
C>Здравствуйте, Voivoid, Вы писали:
C>Как пользователю функции foo понять какие поля присутствуют в возвращаемом значении?
Посмотрев на реализацию функции. Лично я предполагаю не добавлять такого рода функции в header'ы, а использовать их только в анонимных namespace'ах cpp файлов.