7 Eylül 2020 Pazartesi

Generic Lambda

Giriş
C++14 ile yapılabilir. Eğer C++14 kullanamıyorsak lambda yerine aynı işlevi gören basit functor'lar da kullanılabilir.

Generic metod kullanarak şöyle yaparız
// effectively the same as (1)
template <typename T>
void l() {
    T x;
}
Generic struct kullanarak şöyle yaparız.
template<typename T>
struct Functor
{
   void operator () () { T var; ... }
}
Örnek
Şöyle yaparız.
// (1)
template <typename T>
auto l = [] () {
    T x;
};

int main() {
    l<int>();
}
Örnek
İstersek auto şeklinde parametre de geçebiliriz. Şöyle yaparız.
template <typename T>
auto l = [] (auto y) {
    T x = 42;
    std::cout << x + y << std::endl;
};
Tek sıkıntı lambda'nın çağrıldığı namespace içinde olması gerekmesi.

Örnek
Şöyle yaparız
auto gl = [](auto a, auto b) { return a < b; };
std::cout << std::boolalpha 
  << gl(1, 2) << " "      // true ("<int, int>")
  << gl(3.4, 2.2) << " "  // false ("<double, double>")
  << gl(98, 'a');         // false ("<int, char>")

Gcc Extension
Lambda tanımı şöyledir.
lambda-introducer lambda-declaratoropt compound-statement
lambda introducer [capture param1, capture param2] şeklindedir.
lambda declartor ise  parametre alıyorsa (param1,param2) şeklindedir ve isteğe bağlıdır.

gcc bir extension ile şöyle kullanabilmemizi sağlar.
[]<typename>(){}
Örnek 1
Şöyle yaparız.
int main() {
    auto l = []<typename>(){};
    l.operator()<void>();
}
Örnek 2
Şöyle yaparız.
auto l = []<typename T>(T const& x){
  std::cout << __PRETTY_FUNCTION__ << " " << x << std::endl;
};
l(42);
l("Hello world");
Çıktı olarak şunu alırız.
main()::<lambda(const T&)> [with T = int] 42
main()::<lambda(const T&)> [with T = char [12]] Hello world

Hiç yorum yok:

Yorum Gönder