Come confrontare la firma di due funzioni?


35

C'è un modo per verificare se due funzioni hanno la stessa firma? Per esempio:

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 questo esempio, funAed funBè l'unica combinazione di funzioni che dovrebbero ritornare true.

Risposte:


39

In sostanza, vuoi verificare se i tipi di due funzioni sono uguali:

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

Non chiamerei questo "confronto di firme", poiché, se ricordo bene, il tipo restituito non fa parte di una firma (perché non influisce sulla risoluzione del sovraccarico).


20
Un tipo restituito partecipa alla risoluzione di sovraccarico per i puntatori a funzione ed è parte della firma per i modelli di funzione .
Davis Herring,


14

Altri hanno menzionato la soluzione usando std::is_samee decltype.

Ora per generalizzare il confronto per un numero arbitrario di firme di funzioni, è possibile effettuare le seguenti operazioni

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

e confronta quante funzioni desideri

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

( Vedi la demo dal vivo )


O per meno digitando (cioè senza decltype), renderlo come una funzione

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

e chiama semplicemente da

areSameFunctions(funA, funB, funC) 

( Vedi la demo dal vivo )


3

Come altra possibilità che non è stata menzionata: è possibile utilizzare typeidda typeinfoe ==:

#include <typeinfo>

if(typeid(funA) != typeid(funB))
    std::cerr << "Types not the same" << std::endl;

GCC mi dà error: non-constant condition for static assertion.
HolyBlackCat

1
@HolyBlackCat Ah, questo è RTTI. Non sapevo che non lo fossero constexpr. Ho un esempio leggermente migliore ora.
SS Anne,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.