В 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 возврат множества значений из функции.
Это C++17 плюс, что более важно, в случае со structured binding имеется неявная зависимость от порядка следования аргументов. Можно поменять местами аргументы в функции gather и забыть подправить функцию main, что приведет к тому что забиндится не то, что хотелось бы.
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>Я просто хочу вызвать функцию и обращаться к полученному множеству результатов по именам. Альтернатива в виде приседаний с функторами по мне так выглядит менее декларативно.
Нет проблем. есть более декларативные языки.
Здравствуйте, 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>Динамические библиотеки ненавижу, не использую и вам не советую.
А статические?