pallagommosa
pallagommosa

Reputation: 558

How to compare the signature of two functions?

Is there a way to check if two functions have the same signature? For example:

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

In this example, funA and funB is the only combination of functions that should return true.

Upvotes: 35

Views: 2947

Answers (4)

S.S. Anne
S.S. Anne

Reputation: 15586

As another possibility that hasn't been mentioned: you can use typeid from typeinfo and ==:

#include <typeinfo>

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

Upvotes: 3

JeJo
JeJo

Reputation: 32952

Others have mentioned the solution using std::is_same and decltype.

Now to generalize the comparison for an arbitrary number of function signatures, you can do the following

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

and compare as many functions as one like

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

(See Live Demo)


Or for less typing (i.e. without decltype), make it as a function

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

and call simply by

areSameFunctions(funA, funB, funC) 

(See Live Demo)

Upvotes: 14

songyuanyao
songyuanyao

Reputation: 172994

You can check the function type with decltype and std::is_same. e.g.

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

LIVE

Upvotes: 15

HolyBlackCat
HolyBlackCat

Reputation: 96761

Essentially you want to check if types of two functions are the same:

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

I wouldn't call this 'comparing signatures', as, if I remember correctly, return type is not a part of a signature (because it doesn't affect overload resolution).

Upvotes: 40

Related Questions