จะทดสอบเวลาการร่ายได้อย่างไร?

ในการมอบหมายงาน ฉันถูกขอให้สร้าง static_cast และ dynamic_cast ของตัวเองโดยใช้ความเชี่ยวชาญพิเศษของเทมเพลต ฉันจะทดสอบได้อย่างไรว่าการแคสต์แบบคงที่ของฉันเสร็จสิ้นในเวลาคอมไพล์และไดนามิกแคสต์ในเวลารันไทม์จริง ๆ

template<typename Dst, typename Src>
static Dst my_static_cast(Src src);

template<typename Dst, typename Src>
static Dst my_dynamic_cast(Src src);

person Amit Ohayon    schedule 25.06.2015    source แหล่งที่มา
comment
ตรวจสอบรหัสเครื่องที่สร้างขึ้นหรือไม่   -  person Kerrek SB    schedule 25.06.2015
comment
ฉันเดาว่าโค้ดเล็กน้อยจะช่วยได้   -  person Daniel Jour    schedule 25.06.2015
comment
สำหรับการแคสต์แบบไดนามิก คุณสามารถพิสูจน์ได้โดยการเขียนโค้ดที่คอมไพล์ได้ดี แต่มีข้อผิดพลาดในขณะรันไทม์ (เช่น สำหรับประเภทพอยน์เตอร์ dynamic_cast จะส่งคืนค่า NULL หากเข้ากันไม่ได้)   -  person Adam Finley    schedule 25.06.2015
comment
@DanielJour เพิ่มลายเซ็นฟังก์ชันสำหรับสิ่งที่คุ้มค่า ... การใช้งานนั้นน่ารังเกียจและฉันไม่ต้องการคำตอบเฉพาะสำหรับโค้ดของฉัน แต่โดยทั่วไปแล้วจะตรวจสอบเวลาการแคสต์ได้อย่างไร   -  person Amit Ohayon    schedule 25.06.2015


คำตอบ (1)


ไม่ใช่คำตอบที่สมบูรณ์ แต่ลองพิจารณาสิ่งนี้:

class D
{
public:
    virtual ~D(){}
};
class A : public D{};

class B{};

ตอนนี้ dynamic_cast<B*>(new A()) คอมไพล์ตกลง (และส่งกลับ 0) แต่ static_cast<B*>(new A()) ส่งผลให้เกิดข้อผิดพลาดในการรวบรวม ฉันเกือบจะแน่ใจว่าคุณสามารถใช้ SFINAE เพื่อทำการทดสอบที่เหมาะสมได้

แน่นอนว่า การทดสอบนี้ถือว่าคุณเพียงแค่ต้องแยกความแตกต่างระหว่าง static_cast ที่เป็นไปตามมาตรฐาน 100% และ dynamic_cast ที่เป็นไปตามมาตรฐาน 100% ในการตรวจจับข้อบกพร่องในการใช้งานของคุณจำเป็นต้องมีการทดสอบเพิ่มเติม

แก้ไข: คุณไม่สามารถทดสอบได้อย่างสมบูรณ์โดยอัตโนมัติ การแคสต์จำเป็นต้องมีอาร์กิวเมนต์รันไทม์ ดังนั้นจึงไม่สามารถทดสอบได้ในเวลาคอมไพล์ และที่รันไทม์ ข้อแตกต่างเพียงอย่างเดียวระหว่างสิ่งที่คำนวณตามเวลาคอมไพล์กับสิ่งที่คำนวณขณะรันไทม์ก็คือประสิทธิภาพ ฉันไม่แนะนำให้ทดสอบโดย "เอาล่ะ รันไทม์คาสต์ไม่สามารถเร็วขนาดนั้นได้" มันแค่ไม่น่าเชื่อถือ

person matb    schedule 25.06.2015