Re[7]: [trick] C++14 return unnamed structure
От: _hum_ Беларусь  
Дата: 14.10.15 15:11
Оценка:
Здравствуйте, _NN_, Вы писали:

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


__>>p.s. а что в таких случаях будет с перегружаемыми функциями, наподобие auto f(); auto f(int i); ?


_NN>А проблема то в чём ?

_NN>Будут разные типы.

_NN>
_NN>#include <iostream>
_NN>#include <type_traits>

_NN>using namespace std;

_NN>auto f()
_NN>{
_NN>  enum class A { X, Y };
  
_NN>  return A::X;
_NN>}

_NN>auto f(int)
_NN>{
_NN>  enum class A { X, Y };
  
_NN>  return A::X;
_NN>}

_NN>int main()
_NN>{
_NN>  auto fvoid = f();
  
_NN>  auto fint = f(1);
  
_NN>  cout << is_same<decltype(fvoid), decltype(fint)>::value; // 0
_NN>}
_NN>


Вы немного не так поняли. Я-то думал, что речь о том, чтобы задействовать использование идентификатора функции для идентификации типа возвращаемых ею значений (тем самым экономились бы идентификаторы и в то же время обеспечивалась привязка типа к конкретной функции) — эдакой своеобразной инкапсуляции типа в функцию с возможностью явного экспортирования, то есть некоего аналога
struct f
{  
    enum class Res{ok, failed}; 

    Res operator()(){return Res::ok;}
};

для которого можно
void main()
{
    list<f::Res> ResLog;

    for(int i = 0; i < 100; ++i)
    {
         f::Res res = f()();// а хотелось бы f()

         ResLog.push_back(res);
    };    
}



Однако, как в дальнейшем выяснилось, мой вариант невозможен, ибо идентификация области видимости функции по ее имени не уникальна. А изначальный вариант (и ваш его повторяющий) плох тем, что за пределами функции приходится работать с анонимным типом. Соответственно, например, нельзя просто заранее организовать контейнеры для хранения результатов вычислений функции, не говоря уже о том, что читабельность такого варианта плохая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.