26 Eylül 2017 Salı

Closure

Giriş
Closure, lambda ile kullanılıyor. Bu yazıdan lambda konusuna değinmiyorum. Sadece closure sözdizimi üzerinde duracağım.
Closure sözdizimi şöyle. Capture ve mutable alanları mecburi değil.
["CAPTURE"] PARAMETERS ["mutable"] [RETURN] { BODY }
C++11'de kullanılabilecek closure türleri şöyle
[]  Capture nothing (or, a scorched earth strategy?)
[&] Capture any referenced variable by reference
[=] Capture any referenced variable by making a copy
[=, &foo]   Capture any referenced variable by making a copy,
 but capture variable foo by reference
[bar]   Capture bar by making a copy; don't copy anything else
[this]  Capture the this pointer of the enclosing class
Odr-Used
Closure sadece odr-used değişkenleri capture etmek zorunda. const değişkenleri veya derleme zamanı değişkenleri capture etmeden de kullanabiliriz. Şöyle yaparız.
#include <iostream>

template<typename T> void foo(const int *, T f) {...}

int main()
{
  const int data=0;
  foo(&data,[](int baz){
    return data;
  });
}
1. Capture By Reference
Closure - Capture By Reference yazısına taşıdım.

2. Capture By Value
Closure - Capture By Value yazısına taşıdım.

Closure ve Move
Closure move işlemine tabi tutulabilir. Bu durumda içinde capture edilen değişkenler de move edilir. Şöyle yaparız.
std::string s{"Test"};
auto T = [s]() { std::cout << s.size() << ' '; };  // make a copy of s
T();
auto F = std::move(T);
T();
F();
Çıktı olarak 4 0 4 alırız.



Hiç yorum yok:

Yorum Gönder