답변:
본질적으로 두 기능의 유형이 동일한 지 확인하려고합니다.
std::is_same_v<decltype(funA), decltype(funB)>
올바르게 기억한다면 반환 유형은 서명의 일부가 아니기 때문에이 '비교 서명'이라고 부르지 않을 것입니다 (왜냐하면 과부하 해결에 영향을 미치지 않기 때문입니다).
decltype
및로 기능 유형을 확인할 수 있습니다 std::is_same
. 예 :
std::is_same_v<decltype(funA), decltype(funB)> // true
다른 사람들은 std::is_same
and를 사용하여 솔루션을 언급했습니다 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)
( 라이브 데모 참조 )
언급되지 않은 또 다른 가능성 typeid
으로 typeinfo
and 에서 사용할 수 있습니다 ==
.
#include <typeinfo>
if(typeid(funA) != typeid(funB))
std::cerr << "Types not the same" << std::endl;
error: non-constant condition for static assertion
.
constexpr
. 나는 지금 약간 더 나은 예를 가지고 있습니다.