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

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);

在此示例中,funAfunB 是唯一应该 return true.

的函数组合

您可以使用decltype and std::is_same检查函数类型。例如

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

LIVE

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

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

我不会称它为 'comparing signatures',因为,如果我没记错的话,return 类型不是签名的一部分(因为它不影响重载解析)。

其他人提到了使用 std::is_samedecltype 的解决方案。

现在要概括任意数量函数签名的比较,您可以执行以下操作

#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)>

(See Live Demo)


或者为了减少输入(即没有 decltype),将其作为函数

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

并通过

调用
areSameFunctions(funA, funB, funC) 

(See Live Demo)

作为另一种未提及的可能性:您可以使用 typeid 来自 typeinfo==:

#include <typeinfo>

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