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

问题描述 投票:7回答:3

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

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的功能的唯一组合。

c++ function c++17 c++-standard-library function-signature
3个回答
11
投票

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

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

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


7
投票

您可以使用decltypedecltype检查功能类型。例如

std::is_same

std::is_same


4
投票

其他人提到使用std::is_same_v<decltype(funA), decltype(funB)> // true LIVE的解决方案。

现在可以对任意数量的功能签名进行比较,您可以执行以下操作

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)> ),使其作为函数使用

See Live Demo

并简单地致电

decltype

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

© www.soinside.com 2019 - 2024. All rights reserved.