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

时间:2019-11-29 09:45:36

标签: c++ function c++17 c++-standard-library function-signature

是否可以检查两个函数是否具有相同的签名?例如:

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是应返回true的唯一函数组合。

4 个答案:

答案 0 :(得分:39)

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

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

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

答案 1 :(得分:15)

您可以使用decltypestd::is_same检查功能类型。例如

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

LIVE

答案 2 :(得分:14)

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

答案 3 :(得分:3)

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

#include <typeinfo>

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