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

在这个例子中,funAandfunB是唯一应该返回的函数组合true

4

4 回答 4

39

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

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

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

于 2019-11-29T09:48:55.260 回答
15

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

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

居住

于 2019-11-29T09:48:18.693 回答
14

其他人提到了使用std::is_sameand的解决方案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) 

见现场演示

于 2019-11-29T10:17:30.943 回答
3

作为尚未提及的另一种可能性:您可以使用typeidfromtypeinfo==

#include <typeinfo>

if(typeid(funA) != typeid(funB))
    std::cerr << "Types not the same" << std::endl;
于 2019-12-01T04:00:32.530 回答