Existe-t-il un moyen de vérifier si deux fonctions ont la même signature? Par exemple:
int funA (int a, int b);
int funB (int a, int b);
float funC (int a, int b);
int funD (float a, int b);
Dans cet exemple, funA
et funB
est la seule combinaison de fonctions qui devrait retourner true
.
Essentiellement, vous voulez vérifier si les types de deux fonctions sont identiques:
std::is_same_v<decltype(funA), decltype(funB)>
Je n'appellerais pas cela "comparer les signatures", car, si je me souviens bien, le type de retour ne fait pas partie d'une signature (car il n'affecte pas la résolution de surcharge).
Vous pouvez vérifier le type de fonction avec decltype
et std::is_same
. par exemple.
std::is_same_v<decltype(funA), decltype(funB)> // true
D'autres ont mentionné la solution en utilisant std::is_same
et decltype
.
Maintenant, pour généraliser la comparaison d'un nombre arbitraire de signatures de fonction, vous pouvez effectuer les opérations suivantes
#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>...>;
et comparer autant de fonctions qu'une comme
areSameFunctions<decltype(funA), decltype(funB), decltype(funC)>
Ou pour moins de frappe (c'est-à-dire sans decltype
), faites-le comme une fonction
template<typename Func, typename... Funcs>
constexpr bool areSameFunctions(Func&&, Funcs&&...)
{
return std::conjunction_v<std::is_same<Func, Funcs>...>;
}
et appeler simplement par
areSameFunctions(funA, funB, funC)
Autre possibilité non mentionnée: vous pouvez utiliser typeid
depuis typeinfo
et ==
:
#include <typeinfo>
if(typeid(funA) != typeid(funB))
std::cerr << "Types not the same" << std::endl;