How to compare the signature of two functions?
You can check the function type with decltype
and std::is_same
. e.g.
std::is_same_v<decltype(funA), decltype(funB)> // true
LIVE
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)
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;
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).