11 Ekim 2018 Perşembe

C++17 ile If Statement - If statement with initializer

Giriş
Gramer şöyle.
selection-statement:  
    if ( init-statement condition )

init-statement:
    simple-declaration

simple-declaration:
    decl-specifier-seq init-declarator-list;
    decl-specifier-seq ref-qualifier [ identifier-list ] initializer ;
Yapısı şöyle. Bu kullanımın tüm amacı if işleminin sonucunu alan değişkenin scope alanını küçültmek
if (init-statement; condition) statement
Örnek
Eskiden şöyle yapardık. result değişkeni if bloğunun dışında yaşamaya devam ederdi.
bool result = foo();
 if( result ) {
    std::cout << "True!\n";
 } else {
    std::cout << "False!\n";
 }
Şimdi şöyle yaparız.
if( bool result = foo(); result ) {
    std::cout << "True!\n";
 } else {
    std::cout << "False!\n";
 }
Örnek
Şöyle yaparız. r false ise do doSomething() çalışır.
if (auto r = getGlobalObjectByName(word); !r) r->doSomething;
Örnek
Biraz daha karışık kodlar ortaya çıkabiliyor. Şöyle yaparız
int bar();
bool query();
void foo(int, bool);

int main()
{
  if (int x = bar() ; bool y = query())
  {
    foo(x, y);
  }
  else
  {
    foo(x * 2, y);
  }
}

If Statement ve Structured Binding
Açıklaması şöyle.
A simple-declaration is either a comma separated list of declarators that introduce objects of the same type (decl-specifier-seq init-declarator-list;) or a single structured binding (the second, rather verbose line under simple-declaration).
Örnek
Şöyle yaparız.
std::map<int, std::string> Map;
// ...

if (auto[it, inserted] = Map.insert(std::pair(10, "10")); inserted)
    ; // do something with *it.
Örnek
Şu kod birden fazla "structured binding" kullandığı için derlenmez
if (auto[iter, success] = set.insert("Hello"),
        [iter2, success2] = set.insert("Foo"); success && success2)
{}
else
{}
Şöyle yaparız
if (auto[iter, success, iter2,success2] =std::tuple_cat (set.insert("Hello"),
        set.insert("Foo")); success && success2)
{}
else
{}

Hiç yorum yok:

Yorum Gönder