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

[C++SNO] Safe Navigation Operator

Страницы: 1 2 3 4 Следующая »
#0
12:31, 19 дек. 2013

Всем привет.

Для тех кто не вкурсе:

#include <stdio.h>
#include <memory>
struct foo{int x;};
bool bar(bool flag){printf("bar(%s);\n",flag?"true":"false");return flag;}
int main(){
  foo*p=nullptr;
  p?->x=10;  //всё ок. 
  if(bar(p?->x==10))printf("x==10\n"); //функция bar - не вызовется. printf - тоже.
  std::unique_ptr<foo> ptr(p);
  ptr?->x=20;  //сначала вызываем std::unique_ptr<foo>::operator bool() а затем получив false ничего не делаем :)
  return 0;
};

//added:
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, но c макросами:
int get_to2_to1_to0_id(t_link_3*p)
{
  int id=0;
  if(!p)return id;
  auto*pprev=p;
  #define F(TO)auto*p=pprev->TO;if(!p)return id;auto*pprev=p;
  {F(to2);{F(to1);{F(to0);id=p->id}}}
  #undef F
  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;
}


Предлагаю в этой теме сделать ставки на то, когда в С++ появится subj.

also:
  все мои сообщения в этой теме: http://www.gamedev.ru/flame/forum/?id=184003&user=31456


#1
12:36, 19 дек. 2013

я нифига не понял, что он возвращает, когда облом?

#2
12:38, 19 дек. 2013

почему бы не добавить еще ?+=, ?<<, ?[] и "?," ?

#3
12:39, 19 дек. 2013

да, и наконец-то добавить
:<=
:>=

#4
12:43, 19 дек. 2013

И заодно &&= из соседней темы. Ну и ^^ уж, чисто для красоты.

#5
12:46, 19 дек. 2013

Никогда.
p.s. Нашли что улучшать..

#6
12:46, 19 дек. 2013

TarasB
>я нифига не понял, что он возвращает, когда облом?
Кэп подсказывает что в случае null-а

p?->x=10;
присваивание не будет выполнено ;
#7
12:48, 19 дек. 2013

TarasB
> я нифига не понял, что он возвращает, когда облом?

немного подробностей про то откуда этот оператор: см. Оператор безопасной навигации (Safe Navigation Operator)

kipar
> почему бы не добавить еще
надо подумать :)
> ?[]
вроде нельзя добавить, лямбды мешают.
можно вот так:
char at(int index){
  string s="123";
  return s?.[index]; // "operator ?.[]" проверят если s.size()!=0 то тогда, например, можно вызывать s.at(index%s.size()).
}

#8
12:50, 19 дек. 2013

nes
А вернет то что? Присвоение ведь возвращает значение. А bar в примере каким-то образом не выполнится.

#9
12:56, 19 дек. 2013

kipar
Видимо ничего не возвращает, или void если угодно, как и в случае с бар-ом.
Если есть условие вида if (void), то тупо игнорируется.

#10
12:57, 19 дек. 2013

nes
> Кэп подсказывает что в случае null-а
а если он справа?

#11
12:58, 19 дек. 2013

kipar
> А bar в примере каким-то образом не выполнится.
Это магический оператор, который всегда делает то, что имел в виду программист.

#12
13:01, 19 дек. 2013

TarasB
он и есть справа.

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

nes
bar(void) и if(void) будут ошибкой компиляции. А тут какое-то изменение потока исполнения на ходу.
Допустим в таком примере

int get_result()
{
    ...
    a = p?->field;
    return a.x;
}
будет обращение к неинициализированной а, а в таком
int get_result()
{
    ...
    return p?->field.x;
    return 1;
}
видимо вернется 1.
#14
13:04, 19 дек. 2013

nes
Право - это там -->
Спрошу более конкретно, как выполнится это?

a = b ?. x;
Страницы: 1 2 3 4 Следующая »
ФлеймФорумПрограммирование

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