Войти
ФлеймФорумПрограммирование

[C++SNO] Safe Navigation Operator (4 стр)

Страницы: 1 2 3 4
#45
18:46, 19 дек. 2013

Pushkoff
> а если у нас ?-> встречается 2 раза?
второй пример вот тут:
http://www.gamedev.ru/flame/forum/?id=184003&page=2#m17
короче, по одному if`у на каждый SNO.

Pushkoff
> к стати наличие скобок убивает компактность
вообще если усложнить конвертор AST, то можно обойтись и без скобок, но тогда появится неявное поведение. тоесть некторые наследники i_stat будет неявно "убираться" из блока.

кстати, кто-нибудь может попробовать написать код аналогичный вот этому, но без SNO(выручайте, а том мне лень :) ):

struct t_link;struct t_link{int id;t_link*next;};
int get_next_next_next_id(t_link*p){
  int id=0;
  {id=p?->next?->next?->next?->id;}
  return id;
}
Спасибо.
взял этот код вот отсюда(его никто не заметил): http://www.gamedev.ru/flame/forum/?id=184003&page=2#m27
вообще, пример выше и есть основное применение SNO("?->"). я считаю на таких задачах он рвёт весь остальной говнокод.

я обновил почти все свои сообщения.
Предлагаю их перечитать вот по этой ссылке(добавил её в первопост для удобства):
http://www.gamedev.ru/flame/forum/?id=184003&user=31456


#46
18:57, 19 дек. 2013
  for (int i=0;i<3;++i) 
  {
    if (!p) break;
    p=p->next; // p ->= next; ДАДАДА
  }
  if (p) return p->id;
  return 0;
#47
19:01, 19 дек. 2013

TarasB
> // p ->= next; ДАДАДА
указатели могут быть не совместимы
можно рекурсивным шаблоном зарешать

#48
19:04, 19 дек. 2013

TarasB
спасибо.

продолжаем:

struct t_link_0{int id;};
struct t_link_1{unique_ptr<t_link_0> to0;};
struct t_link_2{unique_ptr<t_link_1> to1;};
struct t_link_3{unique_ptr<t_link_2> to2;};

int get_to2_to1_to0_id(t_link_3*p){
  int id=0;
  {id=p?->to2?->to1?->to0?->id;}
  return id;
}

#49
19:04, 19 дек. 2013

Pushkoff
> указатели могут быть не совместимы

Ну и проблемы-то какие? В += тоже могут быть типы несовместимы, и тогда что? Прааавильно. И тут так же.

#50
21:48, 19 дек. 2013

Сделал ещё пример:

struct t_link_0{int id;};
struct t_link_1{t_link_0*to0;};
struct t_link_2{t_link_1*to1;};
struct t_link_3{t_link_2*to2;};

// c SNO
int get_to2_to1_to0_id(t_link_3*p){
  int id=0;
  {id=p?->to2?->to1?->to0?->id;}
  return id;
}

// без SNO
int get_to2_to1_to0_id(t_link_3*p)
{
  int id=0;
  if(!p)return id;
  auto*pprev=p;
  {
    auto*p=pprev->to2;
    if(!p)return id;
    auto*pprev=p;
    {
      auto*p=pprev->to1;
      if(!p)return id;
      auto*pprev=p;
      {
        auto*p=pprev->to0;
        if(!p)return id;
        id=p->id;
      }
    }
  }
  return id;
}
Есть ещё кто-то, кто считает, что SNO не нужно?

кстати, в примере выше нельзя просто так взять и перегнать AST c SNO в AST без SNO, т.к тут придёться создавать безымянные временные переменны.

TarasB
> p ->= next; ДАДАДА
:lol:

#51
21:49, 19 дек. 2013

Adler
> Есть ещё кто-то, кто считает, что SNO не нужно?
я считаю.
оно нужно но не в таком виде

#52
21:56, 19 дек. 2013

Pushkoff
> я считаю.
> оно нужно но не в таком виде
я слушаю, можешь начинать диктовать в каком виде нужно :)

#53
22:02, 19 дек. 2013

Adler
> я слушаю, можешь начинать диктуй в каком виде нужно :)
я не знаю.
я точно уверен что вид предложенный тобой как-то не очевиден.
а отмены вызовов функции это вообще фейл в явном виде

даже в таком виде
id=p?->to2?->to1?->to0?->id;
чему должно быть равно id в случае если оно не сработает?

а допустим такой вид
{int id=p?->to2?->to1?->to0?->id;}
вообще не имеет смысла.

в идеале хотелось бы такого
const int id=p?->to2?->to1?->to0?->id:0; // 0 в случае провала
если этот оператор не позволит создавать константы то зачем он вообще, лучше уж длинным тернарным и константа на выходе

#54
22:13, 19 дек. 2013

Pushkoff
> а отмены вызовов функции это вообще фейл в явном виде
что такое отмена вызова функции?
всё что делает SNO - это добавляет перед statement`ами проверки, можно ли их выполнять.
> чему должно быть равно id в случае если оно не сработает?
если в statement`е есть хоть один SNO который провалился, то весь statement и все следующие за ним statement`ы до конца блока не выполняются вообще.

#55
22:26, 19 дек. 2013

Pushkoff
> чему должно быть равно id в случае если оно не сработает?
0 ну по крайней мере так реализовано в Groovy

#56
22:39, 19 дек. 2013

Pushkoff
> в идеале хотелось бы такого
> const int id=p?->to2?->to1?->to0?->id:0; // 0 в случае провала
хорошая идея кстати:

int id=p?->to2?->to1?->to0?->id:0:1:2:3;
         ^     ^     ^     ^
         3     2     1     0 

а что вот с этим делать:

int id=p?->id:p?->id;
бросить ошибку компиляции или предупреждение или начать отбрасывать statement`ы и не париться?

added:

+ ещё немного идей:

Страницы: 1 2 3 4
ФлеймФорумПрограммирование

Тема в архиве.