Lambda temel sınıflar olarak işlev
Tam olarak anlamadım ilginç bir davranış buldum Lambda ile oynamak.
! 2 şablon parametreleri türeyen struct Overload
, using F1::operator();
bir fıkra vardır.
Şimdi ise tek operatör erişemiyorum iki funktor gelen elde (varsa) F1 beklediğiniz gibi
Eğer iki Lambda Fonksiyonları elde ederse bu artık doğru değil: operatör erişemiyorum() F2 de.
#include <iostream>
// I compiled with g (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
//
// g -Wall -std=c 11 -g main.cc
// g -Wall -std=c 11 -DFUNCTOR -g main.cc
//
// or clang clang version 3.3 (tags/RELEASE_33/rc2)
//
// clang -Wall -std=c 11 -g main.cc
// clang -Wall -std=c 11 -DFUNCTOR -g main.cc
//
// on a Linux localhost.localdomain 3.9.6-200.fc18.i686 #1 SMP Thu Jun 13
// 19:29:40 UTC 2013 i686 i686 i386 GNU/Linux box
struct Functor1
{
void operator()() { std::cout << "Functor1::operator()()\n"; }
};
struct Functor2
{
void operator()(int) { std::cout << "Functor2::operator()(int)\n"; }
};
template <typename F1, typename F2>
struct Overload : public F1, public F2
{
Overload()
: F1()
, F2() {}
Overload(F1 x1, F2 x2)
: F1(x1)
, F2(x2) {}
using F1::operator();
};
template <typename F1, typename F2>
auto get(F1 x1, F2 x2) -> Overload<F1, F2>
{
return Overload<F1, F2>(x1, x2);
}
int main(int argc, char *argv[])
{
auto f = get(Functor1(), Functor2());
f();
#ifdef FUNCTOR
f(2); // this one doesn't work IMHO correctly
#endif
auto f1 = get(
[]() { std::cout << "lambda1::operator()()\n"; },
[](int) { std::cout << "lambda2::operator()(int)\n"; }
);
f1();
f1(2); // this one works but I don't know why
return 0;
}
Standart bildiren:
Lambda ifade türü de kapatılması nesne türü) benzersiz, isimsiz sendikasız bir sınıf türüdür
Her Lambda türleri benzersiz olmalıdır.
Bunun neden böyle olduğunu açıklamak mümkün: herkes bu biraz ışık lütfen tutabilir?
CEVAP
operator()
a sınıfı lambda tarafından tanımlanmış ek olarak (doğru koşullar altında) bir işaretçi için bir dönüşüm sağlayabilir çalışması için. Bu durum (en azından birincil) lambda şey yakalayabilir.
Eğer bir yakalama eklerseniz:
auto f1 = get(
[]() { std::cout << "lambda1::operator()()\n"; },
[i](int) { std::cout << "lambda2::operator()(int)\n"; }
);
f1();
f1(2);
...pointer to function
dönüştürme verilmeyeceği, yukarıdaki kodu derlemeye çalışırken muhtemelen başından beri beklenen hata veriyor:
trash9.cpp: In function 'int main(int, char**)':
trash9.cpp:49:9: error: no match for call to '(Overload<main(int, char**)::<lambda()>, main(int, char**)::<lambda(int)> >) (int)'
trash9.cpp:14:8: note: candidate is:
trash9.cpp:45:23: note: main(int, char**)::<lambda()>
trash9.cpp:45:23: note: candidate expects 0 arguments, 1 provided
C iç sınıflar otomatik olarak arkadaş ...
R, R tam olarak temel işlevleri aynı a...
C# Değişken olarak İşlev Geçerek...
Varsayılan parametre değeri olarak işl...
CoffeeScript olarak işlev bildirimi...