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

35

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

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个回答

40

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

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

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


21
返回类型会参与函数指针的重载决策,并且是函数模板签名的一部分。 - Davis Herring

15

你可以使用decltypestd::is_same来检查函数类型,例如:

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

直播


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

(查看演示)


或者为了少打字(即不使用 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
作为另一个未被提及的可能性:您可以使用 typeinfo 中的 typeid==
#include <typeinfo>

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

GCC 给我 error: non-constant condition for static assertion - HolyBlackCat
1
@HolyBlackCat 啊,这是RTTI。不知道这些不是constexpr。我现在有一个稍微好一点的例子。 - S.S. Anne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接