Wie vergleiche ich die Signatur zweier Funktionen?

35

Gibt es eine Möglichkeit zu überprüfen, ob zwei Funktionen dieselbe Signatur haben? Zum Beispiel:

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 diesem Beispiel ist funAund funBdie einzige Kombination von Funktionen, die zurückgegeben werden sollte true.

Stefano Pittalis
quelle

Antworten:

39

Im Wesentlichen möchten Sie überprüfen, ob die Typen von zwei Funktionen identisch sind:

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

Ich würde dies nicht als "Vergleichen von Signaturen" bezeichnen, da der Rückgabetyp, wenn ich mich richtig erinnere, nicht Teil einer Signatur ist (da er die Überlastungsauflösung nicht beeinflusst).

HolyBlackCat
quelle
20
Ein Rückgabetyp nicht in der Überladungsauflösung für die Funktion teilnehmen Zeiger , und es ist Teil der Signatur für die Funktion ist Vorlagen .
Davis Herring
15

Sie können den Funktionstyp mit decltypeund überprüfen std::is_same. z.B

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

LEBEN

songyuanyao
quelle
14

Andere haben die Lösung mit std::is_sameund erwähntdecltype .

Um den Vergleich für eine beliebige Anzahl von Funktionssignaturen zu verallgemeinern, können Sie Folgendes tun

#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>...>;

und vergleichen Sie so viele Funktionen wie Sie möchten

areSameFunctions<decltype(funA), decltype(funB), decltype(funC)>

( Siehe Live-Demo )


Oder decltypemachen Sie es als Funktion, wenn Sie weniger tippen (dh ohne )

template<typename Func, typename... Funcs>
constexpr bool areSameFunctions(Func&&, Funcs&&...)
{
   return std::conjunction_v<std::is_same<Func, Funcs>...>;
}

und einfach bei anrufen

areSameFunctions(funA, funB, funC) 

( Siehe Live-Demo )

JeJo
quelle
3

Als weitere Möglichkeit, die nicht erwähnt wurde: Sie können typeidvon typeinfound verwenden ==:

#include <typeinfo>

if(typeid(funA) != typeid(funB))
    std::cerr << "Types not the same" << std::endl;
SS Anne
quelle
GCC gibt mir error: non-constant condition for static assertion.
HolyBlackCat
1
@HolyBlackCat Ah, das ist RTTI. Wusste nicht, dass dies nicht der Fall war constexpr. Ich habe jetzt ein etwas besseres Beispiel.
SS Anne