web-dev-qa-db-fra.com

Comment comparer la signature de deux fonctions?

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.

35
Stefano Pittalis

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

39
HolyBlackCat

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

EN DIRECT

15
songyuanyao

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

( Voir la démo en direct )


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) 

( Voir la démo en direct )

14
JeJo

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;
3
S.S. Anne