Lambdas adalah cara luar biasa untuk membuat kode yang dapat digunakan kembali di dalam suatu fungsi/metode tanpa mencemari kelas induk. Mereka merupakan pengganti yang sangat fungsional untuk makro gaya C di sebagian besar waktu.
Namun, ada sedikit gula sintaksis dari makro yang sepertinya tidak bisa saya tiru dengan lambda, dan itu adalah kemampuan untuk keluar dari fungsi yang memuatnya. Misalnya, jika saya perlu kembali sambil memeriksa rentang rangkaian int
s, saya dapat melakukannya dengan mudah menggunakan makro:
const int xmin(1), xmax(5);
#define CHECK_RANGE(x) { if((x) < xmin || (x) > xmax) return false; }
bool myFunc(int myint) {
CHECK_RANGE(myint);
int anotherint = myint + 2;
CHECK_RANGE(anotherint);
return true;
}
Jelas ini adalah contoh yang terlalu disederhanakan, tetapi premis dasarnya adalah saya melakukan pemeriksaan yang sama berulang kali pada variabel yang berbeda, dan menurut saya lebih mudah dibaca untuk merangkum pemeriksaan dan pintu keluar terkait. Namun, saya tahu bahwa makro tidak terlalu aman, terutama ketika makro tersebut menjadi sangat rumit . Namun, sejauh yang saya tahu, mencoba melakukan lambda yang setara memerlukan pemeriksaan tambahan yang canggung seperti:
const int xmin(1), xmax(5);
auto check_range = [&](int x) -> bool { return !(x < xmin || x > xmax); };
bool myFunc(int myint) {
if(!check_range(myint)) return false;
int anotherint = myint + 2;
if(!check_range(anotherint)) return false;
return true;
}
Apakah ada cara untuk melakukan ini dengan lambda? Atau apakah saya melewatkan solusi alternatif?
Edit: Saya menyadari bahwa kembali dari dalam makro umumnya merupakan ide yang buruk kecuali tindakan pencegahan yang signifikan telah dilakukan. Saya hanya ingin tahu apakah itu mungkin.
std::longjmp
bisa membantu. - person Quentin   schedule 01.08.2017longjmp
. - person Daniel H   schedule 01.08.2017std::setjmp
bisa menakut-nakuti diri mereka sendiri -- Saya lebih suka menggunakan makro juga;) - person Quentin   schedule 01.08.2017