วิธีการเปรียบเทียบลายเซ็นของทั้งสองฟังก์ชั่น?


35

มีวิธีการตรวจสอบว่าทั้งสองฟังก์ชั่นมีลายเซ็นเหมือนกันหรือไม่? ตัวอย่างเช่น:

int funA (int a, int b);
int funB (int a, int b);
float funC (int a, int b);
int funD (float a, int b);

ในตัวอย่างนี้funAและเป็นชุดเดียวของฟังก์ชั่นที่ควรจะกลับfunBtrue

คำตอบ:


39

โดยพื้นฐานแล้วคุณต้องการตรวจสอบว่าฟังก์ชั่นสองประเภทเหมือนกันหรือไม่:

std::is_same_v<decltype(funA), decltype(funB)>

ฉันจะไม่เรียกสิ่งนี้ว่า 'การเปรียบเทียบลายเซ็น' เพราะถ้าฉันจำได้อย่างถูกต้องประเภทส่งคืนจะไม่ได้เป็นส่วนหนึ่งของลายเซ็นต์


20
ประเภทผลตอบแทนที่ไม่เข้าร่วมในการแก้ปัญหาสำหรับการทำงานเกินตัวชี้และมันเป็นส่วนหนึ่งของลายเซ็นสำหรับการทำงานของแม่
Davis Herring


14

อื่น ๆ ได้กล่าวถึงวิธีการแก้ปัญหาโดยใช้และstd::is_samedecltype

ทีนี้เพื่อทำการเปรียบเทียบการเปรียบเทียบสำหรับจำนวนของลายเซ็นฟังก์ชันโดยพลการ

#include <type_traits> // std::is_same, std::conjunction_v

template<typename Func, typename... Funcs>
constexpr bool areSameFunctions = std::conjunction_v<std::is_same<Func, Funcs>...>;

และเปรียบเทียบฟังก์ชั่นได้มากเท่าที่ต้องการ

areSameFunctions<decltype(funA), decltype(funB), decltype(funC)>

( ดูการสาธิตสด )


หรือสำหรับการพิมพ์น้อยลง (เช่นไม่มีdecltype) ให้ใช้เป็นฟังก์ชั่น

template<typename Func, typename... Funcs>
constexpr bool areSameFunctions(Func&&, Funcs&&...)
{
   return std::conjunction_v<std::is_same<Func, Funcs>...>;
}

และเรียกง่ายๆโดย

areSameFunctions(funA, funB, funC) 

( ดูการสาธิตสด )


3

ความเป็นไปได้อื่นที่ไม่ได้กล่าวถึง: คุณสามารถใช้typeidจากtypeinfoและ==:

#include <typeinfo>

if(typeid(funA) != typeid(funB))
    std::cerr << "Types not the same" << std::endl;

GCC error: non-constant condition for static assertionให้ฉัน
HolyBlackCat

1
@HolyBlackCat อ้านี่คือ RTTI constexprไม่ได้รู้ว่าสิ่งเหล่านี้ไม่ได้ ตอนนี้ฉันมีตัวอย่างที่ดีขึ้นเล็กน้อย
SS Anne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.