如何比较两个函数的签名?


Answers:


39

本质上,您想检查两个函数的类型是否相同:

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

我不会将其称为“比较签名”,因为如果我没记错的话,返回类型不是签名的一部分(因为它不会影响重载解析)。


20
返回类型的确参与了函数指针的重载解析,并且它是函数模板的签名的一部分。
戴维斯·鲱鱼


14

其他人提到了使用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) 

请参见现场演示


3

另一个未提及的可能性:您可以使用typeidfrom typeinfo==

#include <typeinfo>

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

海湾合作委员会给我error: non-constant condition for static assertion
HolyBlackCat

1
@HolyBlackCat啊,这是RTTI。不知道这些不是constexpr。我现在有一个更好的例子。
SS安妮
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.