Lambdas เป็นวิธีที่ยอดเยี่ยมในการสร้างโค้ดที่นำมาใช้ซ้ำได้ภายในฟังก์ชัน/เมธอด โดยไม่กระทบต่อคลาสพาเรนต์ เป็นการทดแทนมาโครแบบ C ที่ใช้งานได้ดีเกือบตลอดเวลา
อย่างไรก็ตาม มีน้ำตาลเชิงวากยสัมพันธ์เล็กน้อยจากมาโครที่ฉันไม่สามารถทำซ้ำด้วยแลมบ์ดาได้ และนั่นคือความสามารถในการออกจากฟังก์ชันที่มีอยู่ ตัวอย่างเช่น หากฉันต้องการส่งคืนพร้อมตรวจสอบช่วงของชุดข้อมูล int
s ฉันสามารถทำสิ่งนั้นได้อย่างง่ายดายด้วยมาโคร:
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;
}
แน่นอนว่านี่เป็นตัวอย่างที่ง่ายเกินไป แต่หลักพื้นฐานก็คือ ฉันกำลังตรวจสอบตัวแปรต่างๆ ซ้ำแล้วซ้ำอีก และฉันคิดว่าการสรุปการตรวจสอบและทางออกที่เกี่ยวข้องจะอ่านได้ง่ายกว่า อย่างไรก็ตาม ฉันทราบดีว่า มาโครไม่ปลอดภัยนัก โดยเฉพาะอย่างยิ่งเมื่อมีความซับซ้อนมาก . อย่างไรก็ตาม เท่าที่ฉันสามารถบอกได้ การพยายามทำแลมบ์ดาที่เทียบเท่านั้นจำเป็นต้องมีการตรวจสอบเพิ่มเติมที่น่าอึดอัดใจ ดังนี้:
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;
}
มีวิธีการทำเช่นนี้กับแลมบ์ดาหรือไม่? หรือฉันขาดวิธีแก้ปัญหาอื่นไป?
แก้ไข: ฉันรับรู้ว่า การกลับมาจากภายในมาโครโดยทั่วไปเป็นความคิดที่ไม่ดี เว้นแต่ มีการใช้มาตรการป้องกันที่สำคัญ ฉันแค่สงสัยว่ามันเป็นไปได้หรือไม่
std::longjmp
สามารถทำได้อย่างไร ช่วย. - person Quentin   schedule 01.08.2017longjmp
ทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน - person Daniel H   schedule 01.08.2017std::setjmp
สามารถทำให้ตัวเองกลัวได้ - ฉันอยากจะใช้มาโครด้วย ;) - person Quentin   schedule 01.08.2017