কিভাবে দুটি ফাংশনের স্বাক্ষর তুলনা করতে?


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
@ হোলি ব্ল্যাকগ্যাট আহ, এটি আরটিটিআই। জানতেন না যে এগুলি ছিল না constexpr। আমার এখন আরও কিছুটা ভাল উদাহরণ রয়েছে।
এসএস অ্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.