有没有一种方法可以检查两个函数是否具有相同的签名? 例如:
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
是唯一能够返回true
的函数组合。有没有一种方法可以检查两个函数是否具有相同的签名? 例如:
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
是唯一能够返回true
的函数组合。本质上您想检查两个函数的类型是否相同:
std::is_same_v<decltype(funA), decltype(funB)>
我不会称其为“比较签名”,因为如果我记得正确的话,返回类型不是签名的一部分(因为它不影响重载解析)。
其他人已经提到了使用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)
(查看演示)
typeinfo
中的 typeid
和 ==
:#include <typeinfo>
if(typeid(funA) != typeid(funB))
std::cerr << "Types not the same" << std::endl;
error: non-constant condition for static assertion
。 - HolyBlackCatconstexpr
。我现在有一个稍微好一点的例子。 - S.S. Anne