35

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.

JeJo
  • 30,635
  • 6
  • 49
  • 88
pallagommosa
  • 558
  • 7
  • 15

4 Answers4

40

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).

HolyBlackCat
  • 78,603
  • 9
  • 131
  • 207
  • 21
    A return type does participate in overload resolution for function *pointers*, and it is part of the signature for function *templates*. – Davis Herring Nov 29 '19 at 15:34
15

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

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

LIVE

songyuanyao
  • 169,198
  • 16
  • 310
  • 405
14

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)

JeJo
  • 30,635
  • 6
  • 49
  • 88
3

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;
S.S. Anne
  • 15,171
  • 8
  • 38
  • 76