İki fonksiyonun imzası nasıl karşılaştırılır?


35

İki işlevin aynı imzayı olup olmadığını kontrol etmenin bir yolu var mı? Örneğin:

int funA (int a, int b);
int funB (int a, int b);
float funC (int a, int b);
int funD (float a, int b);

Bu örnekte funAve funBdönmesi gereken işlevlerin tek birleşimidir true.

Yanıtlar:


39

Temelde iki işlev türünün aynı olup olmadığını kontrol etmek istersiniz:

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

Bu 'imzaları karşılaştırma' olarak adlandırmazdım, çünkü doğru hatırlıyorsam, dönüş türü bir imzanın parçası değildir (çünkü aşırı yük çözünürlüğünü etkilemez).


20
Bir dönüş türü, işlev işaretçileri için aşırı yük çözünürlüğüne katılır ve işlev şablonları için imzanın bir parçasıdır .
Davis Herring


14

Diğerleri std::is_sameve kullanarak çözümden bahsetmişlerdir decltype.

Şimdi isteğe bağlı sayıda işlev imzası karşılaştırmasını genelleştirmek için aşağıdakileri yapabilirsiniz

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

ve aynı işlevi

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

( Canlı Demoya Bakın )


Veya daha az yazmak için (yani olmadan decltype), bir işlev olarak yapın

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

ve sadece

areSameFunctions(funA, funB, funC) 

( Canlı Demoya Bakın )


3

Bahsedilmeyen başka bir olasılık olarak: ve typeidarasında kullanabilirsiniz :typeinfo==

#include <typeinfo>

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

GCC bana veriyor error: non-constant condition for static assertion.
HolyBlackCat

1
@HolyBlackCat Ah, bu RTTI. Bunların olmadığını bilmiyordum constexpr. Şimdi biraz daha iyi bir örneğim var.
SS Anne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.