Reputation: 558
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
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
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)>
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)
Upvotes: 14
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
Upvotes: 15
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