[trick] C++14 return unnamed structure
От: B0FEE664  
Дата: 08.10.15 10:02
Оценка: 40 (6)
Наконец-то можно возвращать структуры определённые внутри, а не вне функции:
#include <iostream>

auto fun()
{
    int i = 1;
    return i;
}

auto fun2()
{
    enum Result : int { a, b, c };
    Result e = a;
    return e;
}


auto fun3()
{
    struct st{ int m_a; int m_b; };
    st t;
    t.m_a = 1;
    t.m_b = 2;
    
    return t;
}


int main()
{
    std::cout << fun() << std::endl;
    
    auto e1 = fun2();
    auto e2 = fun2();
    
    std::cout << "e1 == e2 - " << (e1 == e2 ? "true" : "false") << std::endl;
    std::cout << "e1 == b - " << (e1 == decltype(e1)::b ? "true" : "false") << std::endl;

    auto t = fun3();
    
    std::cout << "t.m_a = " << t.m_a << std::endl;
    std::cout << "t.m_b = " << t.m_b << std::endl;
    return 0;
}

ideone
И каждый день — без права на ошибку...
Re: [trick] C++14 return unnamed structure
От: Vain Россия google.ru
Дата: 08.10.15 11:48
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>Наконец-то можно возвращать структуры определённые внутри, а не вне функции:

А в чём трюк то заключается?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: [trick] C++14 return unnamed structure
От: Evgeny.Panasyuk Россия  
Дата: 08.10.15 11:54
Оценка: 5 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE>Наконец-то можно возвращать структуры определённые внутри, а не вне функции:

BFE>
BFE>auto fun2()
BFE>{
BFE>    enum Result : int { a, b, c };
BFE>    Result e = a;
BFE>    return e;
BFE>}
BFE>


Для лямбд это работает и в C++11.
На базе этого например реализуется
Автор: Evgeny.Panasyuk
Дата: 12.10.14
эмуляция "anonymous types".
Re: [trick] C++14 return unnamed structure
От: T4r4sB Россия  
Дата: 08.10.15 12:26
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Наконец-то можно возвращать структуры определённые внутри, а не вне функции:


Можно? А в какой именно не-сырой версии Студии?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: [trick] C++14 return unnamed structure
От: B0FEE664  
Дата: 08.10.15 12:45
Оценка: +3
Здравствуйте, Vain, Вы писали:

BFE>>Наконец-то можно возвращать структуры определённые внутри, а не вне функции:

V>А в чём трюк то заключается?

Не знаю как вам, а мне часто хочется написать функцию возвращающую код ошибки осмысленным текстом:

enum class FunResult
{
  Ok,
  WrongFormat,
  DeviceError
};


FunResult fun()
{
  return FunResult::Ok;
}


Идеальным решением для меня было бы такое:
enum class
{
  Ok,
  WrongFormat,
  DeviceError
} fun()
{
  return FunResult::Ok;
}


Но так по стандарту нельзя. Зато можно внести enum внутрь функции.

Тоже самое касается и, например, std::pair, как результата функции. Вечно забываю, где ключ, а где данное. Теперь можно писать:
auto Get(int i)
{
  struct Result
  {
     int m_nValue;
     int m_nKey;
  };

  Result res = { 2, 3 };

  return res;
}
И каждый день — без права на ошибку...
Re[2]: [trick] C++14 return unnamed structure
От: B0FEE664  
Дата: 08.10.15 12:53
Оценка:
Здравствуйте, T4r4sB, Вы писали:

BFE>>Наконец-то можно возвращать структуры определённые внутри, а не вне функции:

TB>Можно? А в какой именно не-сырой версии Студии?

Согласно стандарту — можно, а вот на практике...
Мы только недавно на С++11 перешли.
И каждый день — без права на ошибку...
Re[3]: [trick] C++14 return unnamed structure
От: Evgeny.Panasyuk Россия  
Дата: 08.10.15 16:00
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Не знаю как вам, а мне часто хочется написать функцию возвращающую код ошибки осмысленным текстом:

BFE>...
BFE>Идеальным решением для меня было бы такое:
BFE>[ccode]
BFE>...
BFE>Но так по стандарту нельзя. Зато можно внести enum внутрь функции.
BFE>...
BFE>Тоже самое касается и, например, std::pair, как результата функции. Вечно забываю, где ключ, а где данное. Теперь можно писать:

Полностью согласен, не вижу смысла пытаться запихнуть всё в error_code/pair/tuple и т.п. — обычная структура/enum удобнее.
Разве что бывают случаи где pair/tuple оправданны за счёт того что дают обход полей/операторы сравнения/и т.п., и то это только пока нет compile-time reflection. Либо как промежуточные результаты работы обобщённого/МП кода.
Re[3]: [trick] C++14 return unnamed structure
От: Vain Россия google.ru
Дата: 08.10.15 22:52
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>>>Наконец-то можно возвращать структуры определённые внутри, а не вне функции:

V>>А в чём трюк то заключается?
BFE>Не знаю как вам, а мне часто хочется написать функцию возвращающую код ошибки осмысленным текстом:
Я к тому это, что сообщения с префиксом [trick] здесь пишут, если в коде имеется действительно какой-то трюк или хинт с кодом, чтобы добиться желаемого. Но в приведённом тобой коде я трюков никаких не увидел, зато увидел применение обычного синтаксиса поддерживаемого самим языком. Это не является трюком.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: [trick] C++14 return unnamed structure
От: enji  
Дата: 09.10.15 06:21
Оценка:
Здравствуйте, Vain, Вы писали:

V>Я к тому это, что сообщения с префиксом [trick] здесь пишут, если в коде имеется действительно какой-то трюк или хинт с кодом, чтобы добиться желаемого. Но в приведённом тобой коде я трюков никаких не увидел, зато увидел применение обычного синтаксиса поддерживаемого самим языком. Это не является трюком.


Вот ты зануда
для меня, например, трюк — не сталкивался с таким и не подумал, какие горизонты откроет auto в типе возвращаемого значения
Re[5]: [trick] C++14 return unnamed structure
От: Vain Россия google.ru
Дата: 09.10.15 08:15
Оценка:
Здравствуйте, enji, Вы писали:

V>>Я к тому это, что сообщения с префиксом [trick] здесь пишут, если в коде имеется действительно какой-то трюк или хинт с кодом, чтобы добиться желаемого. Но в приведённом тобой коде я трюков никаких не увидел, зато увидел применение обычного синтаксиса поддерживаемого самим языком. Это не является трюком.

E>Вот ты зануда
E>для меня, например, трюк — не сталкивался с таким и не подумал, какие горизонты откроет auto в типе возвращаемого значения
неименованые структуры и раньше можно было тайпдефить, ауто и раньше в разные типы превращалось, — не понятно в чём открытие.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[6]: [trick] C++14 return unnamed structure
От: enji  
Дата: 09.10.15 08:21
Оценка:
Здравствуйте, Vain, Вы писали:

V>неименованые структуры и раньше можно было тайпдефить, ауто и раньше в разные типы превращалось, — не понятно в чём открытие.


а при чем тут неименованные структуры? Просто не додумался, что можно вернуть объект локального типа

auto f() {
  struct T {}; 
  return T();
}
Re[4]: [trick] C++14 return unnamed structure
От: B0FEE664  
Дата: 09.10.15 08:30
Оценка:
Здравствуйте, Vain, Вы писали:

V>Я к тому это, что сообщения с префиксом [trick] здесь пишут, если в коде имеется действительно какой-то трюк или хинт с кодом, чтобы добиться желаемого. Но в приведённом тобой коде я трюков никаких не увидел, зато увидел применение обычного синтаксиса поддерживаемого самим языком. Это не является трюком.


Я рад, что вы так говорите. Значит тут с внешним и внутренним связыванием всё ок? Да?
И каждый день — без права на ошибку...
Re[7]: [trick] C++14 return unnamed structure
От: Vain Россия google.ru
Дата: 09.10.15 08:36
Оценка:
Здравствуйте, enji, Вы писали:

V>>неименованые структуры и раньше можно было тайпдефить, ауто и раньше в разные типы превращалось, — не понятно в чём открытие.

E>а при чем тут неименованные структуры?
именно для них запрет был

E>Просто не додумался, что можно вернуть объект локального типа

а вот это уже трюк, только наоборот
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[8]: [trick] C++14 return unnamed structure
От: B0FEE664  
Дата: 09.10.15 08:42
Оценка:
Здравствуйте, Vain, Вы писали:

V>>>неименованые структуры и раньше можно было тайпдефить, ауто и раньше в разные типы превращалось, — не понятно в чём открытие.

E>>а при чем тут неименованные структуры?
V>именно для них запрет был
Где? Не было такого запрета. Был и остаётся запрет на определение типа в описании функции.

Кстати:
auto fun3()
{
    struct { int m_a; int m_b; } t;
    t.m_a = 1;
    t.m_b = 2;
     
    return t;
}


И каждый день — без права на ошибку...
Отредактировано 09.10.2015 8:43 B0FEE664 . Предыдущая версия .
Re[9]: [trick] C++14 return unnamed structure
От: Vain Россия google.ru
Дата: 09.10.15 18:10
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, Vain, Вы писали:


V>>именно для них запрет был

BFE>Где? Не было такого запрета. Был и остаётся запрет на определение типа в описании функции.
Возможно не запрет, а просто проблемы в компиляторах. Сейчас уже не помню, но приходилось добавлять имя чтобы компилировалось нормально.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: [trick] C++14 return unnamed structure
От: Vain Россия google.ru
Дата: 10.10.15 13:52
Оценка:
Здравствуйте, B0FEE664, Вы писали:

V>>Я к тому это, что сообщения с префиксом [trick] здесь пишут, если в коде имеется действительно какой-то трюк или хинт с кодом, чтобы добиться желаемого. Но в приведённом тобой коде я трюков никаких не увидел, зато увидел применение обычного синтаксиса поддерживаемого самим языком. Это не является трюком.

BFE>Я рад, что вы так говорите. Значит тут с внешним и внутренним связыванием всё ок? Да?
Не вижу связи, причём здесь это?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: [trick] C++14 return unnamed structure
От: UA Украина  
Дата: 10.10.15 17:29
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Наконец-то можно возвращать структуры определённые внутри, а не вне функции:


Зачем вообще что то объявлять?

Делали бы так:
auto fun_test()
{
    //...
    return { int error_code = 1, error_status = obj.status; string description = obj.description; };
}
Re[2]: [trick] C++14 return unnamed structure
От: Evgeny.Panasyuk Россия  
Дата: 10.10.15 17:34
Оценка:
Здравствуйте, UA, Вы писали:

BFE>>Наконец-то можно возвращать структуры определённые внутри, а не вне функции:

UA>Зачем вообще что то объявлять?
UA>Делали бы так:
UA>
UA>auto fun_test()
UA>{
UA>    //...
UA>    return { int error_code = 1, error_status = obj.status; string description = obj.description; };
UA>}
UA>


Прям так сейчас нельзя. С макросами можно вот так
Автор: Evgeny.Panasyuk
Дата: 12.10.14
:
auto fun_test()
{
    return NEW((error_code, 1)(error_status, obj.status)(description, obj.description));
}
Re[2]: [trick] C++14 return unnamed structure
От: Went  
Дата: 10.10.15 18:28
Оценка: -1
Здравствуйте, UA, Вы писали:
UA>Делали бы так...
Для этого есть туплы.
Re[3]: [trick] C++14 return unnamed structure
От: Evgeny.Panasyuk Россия  
Дата: 10.10.15 18:36
Оценка: +1
Здравствуйте, Went, Вы писали:

UA>>Делали бы так...

W>Для этого есть туплы.

У их полей нет имён.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.