如何比较两个函数的签名?
How to compare the signature of two functions?
有没有办法检查两个函数是否具有相同的签名?例如:
int funA (int a, int b);
int funB (int a, int b);
float funC (int a, int b);
int funD (float a, int b);
在此示例中,funA
和 funB
是唯一应该 return true
.
的函数组合
您可以使用decltype
and std::is_same
检查函数类型。例如
std::is_same_v<decltype(funA), decltype(funB)> // true
本质上你想检查两个函数的类型是否相同:
std::is_same_v<decltype(funA), decltype(funB)>
我不会称它为 'comparing signatures',因为,如果我没记错的话,return 类型不是签名的一部分(因为它不影响重载解析)。
其他人提到了使用 std::is_same
和 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
和 ==
:
#include <typeinfo>
if(typeid(funA) != typeid(funB))
std::cerr << "Types not the same" << std::endl;
有没有办法检查两个函数是否具有相同的签名?例如:
int funA (int a, int b);
int funB (int a, int b);
float funC (int a, int b);
int funD (float a, int b);
在此示例中,funA
和 funB
是唯一应该 return true
.
您可以使用decltype
and std::is_same
检查函数类型。例如
std::is_same_v<decltype(funA), decltype(funB)> // true
本质上你想检查两个函数的类型是否相同:
std::is_same_v<decltype(funA), decltype(funB)>
我不会称它为 'comparing signatures',因为,如果我没记错的话,return 类型不是签名的一部分(因为它不影响重载解析)。
其他人提到了使用 std::is_same
和 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
和 ==
:
#include <typeinfo>
if(typeid(funA) != typeid(funB))
std::cerr << "Types not the same" << std::endl;