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
Şöyle yaparız.
İstersek auto şeklinde parametre de geçebiliriz. Şöyle yaparız.
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
// (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 [capture param1, capture param2] şeklindedir.lambda-introducer lambda-declaratoropt compound-statement
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