ทุกครั้งที่เพิ่มวิธีการใหม่ ๆ (และมักจะทำหน้าที่) ในไลบรารีมาตรฐานจะเกิดขึ้น
สมมติว่าคุณมีไลบรารีมาตรฐาน:
struct example {
void do_stuff() const;
};
ค่อนข้างเรียบง่าย ในการแก้ไขมาตรฐานบางอย่างจะมีการเพิ่มวิธีการใหม่หรือการโอเวอร์โหลดหรือถัดจากสิ่งใด ๆ :
struct example {
void do_stuff() const;
void method();
};
สิ่งนี้สามารถเปลี่ยนลักษณะการทำงานของโปรแกรม C ++ ที่มีอยู่ได้อย่างเงียบ ๆ
เนื่องจากความสามารถในการสะท้อนที่ จำกัด ของ C ++ ในขณะนี้เพียงพอที่จะตรวจจับว่ามีวิธีการดังกล่าวอยู่หรือไม่และเรียกใช้รหัสที่แตกต่างกันตาม
template<class T, class=void>
struct detect_new_method : std::false_type {};
template<class T>
struct detect_new_method< T, std::void_t< decltype( &T::method ) > > : std::true_type {};
นี่เป็นเพียงวิธีที่ค่อนข้างง่ายในการตรวจจับสิ่งใหม่ ๆmethod
มีหลายวิธี
void task( std::false_type ) {
std::cout << "old code";
};
void task( std::true_type ) {
std::cout << "new code";
};
int main() {
task( detect_new_method<example>{} );
}
สิ่งเดียวกันนี้สามารถเกิดขึ้นได้เมื่อคุณลบเมธอดออกจากคลาส
แม้ว่าตัวอย่างนี้จะตรวจจับการมีอยู่ของวิธีการโดยตรง แต่สิ่งที่เกิดขึ้นทางอ้อมนี้อาจเกิดขึ้นได้น้อยกว่า ตัวอย่างที่เป็นรูปธรรมคุณอาจมีเครื่องมือการทำให้เป็นอนุกรมที่ตัดสินใจว่าสิ่งที่สามารถทำให้เป็นอนุกรมเป็นคอนเทนเนอร์ได้โดยขึ้นอยู่กับว่าสามารถทำซ้ำได้หรือไม่หรือมีข้อมูลที่ชี้ไปที่ไบต์ดิบและขนาดสมาชิกโดยมีค่าหนึ่งที่ต้องการมากกว่า อื่น ๆ.
มาตรฐานไปและเพิ่ม.data()
วิธีการลงในคอนเทนเนอร์และทันใดนั้นประเภทก็เปลี่ยนเส้นทางที่ใช้สำหรับการทำให้เป็นอนุกรม
มาตรฐาน C ++ ทั้งหมดสามารถทำได้หากไม่ต้องการหยุดการทำงานก็คือการทำให้รหัสที่แตกอย่างเงียบ ๆ นั้นหายากหรือไม่มีเหตุผล