दो कार्यों के हस्ताक्षर की तुलना कैसे करें?


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और funBफ़ंक्शन का एकमात्र संयोजन है जिसे वापस लौटना चाहिए true

जवाबों:


39

आवश्यक रूप से आप जांचना चाहते हैं कि क्या दो प्रकार के कार्य समान हैं:

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

मैं इस 'तुलनात्मक हस्ताक्षर' को नहीं कहूंगा, जैसे कि अगर मुझे सही याद है, तो वापसी का प्रकार हस्ताक्षर का हिस्सा नहीं है (क्योंकि यह अधिभार संकल्प को प्रभावित नहीं करता है)।


20
एक वापसी प्रकार फ़ंक्शन पॉइंटर्स के लिए अधिभार संकल्प में भाग लेता है , और यह फ़ंक्शन टेम्प्लेट के लिए हस्ताक्षर का हिस्सा है ।
डेविस हेरिंग


14

दूसरों ने समाधान का उपयोग करने का उल्लेख किया है std::is_sameऔर decltype

अब फ़ंक्शन हस्ताक्षर की एक मनमानी संख्या के लिए तुलना को सामान्य करने के लिए, आप निम्न कार्य कर सकते हैं

#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;

जीसीसी मुझे देता है error: non-constant condition for static assertion
होलीब्लैककट

1
@HolyBlackCat आह, यह RTTI है। नहीं पता था कि ये नहीं थे constexpr। मेरे पास अब थोड़ा बेहतर उदाहरण है।
एसएस ऐनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.