두 함수의 서명을 비교하는 방법은 무엇입니까?


35

두 함수가 동일한 서명을 가지고 있는지 확인하는 방법이 있습니까? 예를 들면 다음과 같습니다.

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

이 예에서 funAfunB돌려 함수의 유일한 조합이다 true.

답변:


39

본질적으로 두 기능의 유형이 동일한 지 확인하려고합니다.

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

올바르게 기억한다면 반환 유형은 서명의 일부가 아니기 때문에이 '비교 서명'이라고 부르지 않을 것입니다 (왜냐하면 과부하 해결에 영향을 미치지 않기 때문입니다).


20
반환 형식은 함수 포인터의 오버로드 확인에 참여 하며 함수 템플릿 의 서명의 일부입니다 .
Davis Herring


14

다른 사람들은 std::is_sameand를 사용하여 솔루션을 언급했습니다 decltype.

임의의 수의 함수 시그니처에 대한 비교를 일반화하려면 다음을 수행하십시오.

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

하나의 기능만큼 많은 기능을 비교

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

( 라이브 데모 참조 )


또는 타이핑을 줄이려면 (예 :없이 decltype) 함수로 작성하십시오.

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

간단히 전화

areSameFunctions(funA, funB, funC) 

( 라이브 데모 참조 )


3

언급되지 않은 또 다른 가능성 typeid으로 typeinfoand 에서 사용할 수 있습니다 ==.

#include <typeinfo>

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

GCC가 나에게 준다 error: non-constant condition for static assertion.
HolyBlackCat

1
@HolyBlackCat 아, 이것은 RTTI입니다. 이것들이 아니었다는 것을 몰랐다 constexpr. 나는 지금 약간 더 나은 예를 가지고 있습니다.
SS Anne
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.