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.

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


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


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 )


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;

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.