gpt4 book ai didi

c++ - 如何从 `decltype()` 获取函数参数的数量?

转载 作者:行者123 更新时间:2023-12-01 14:04:19 27 4
gpt4 key购买 nike

假设我有以下函数声明:

template<typename signature>
int foo();
给定上述函数,是否可以定义 foo以这种方式,以便它返回在 decltype 中传递的函数参数的数量模板参数?
所以示例用法可能如下所示:
int bar(int a, int b) 
{
return a + b;
}

int jar(int a)
{
return a * a;
}

int main()
{
std::cout << foo<decltype(bar)>() << std::endl; // Desired output: 2
std::cout << foo<decltype(jar)>() << std::endl; // Desired output: 1
}

编辑:
感谢大家的回复。它们似乎确实有效。但是,我忘了提及另外一个用例。
假设我想获取以下函数的参数数量:
int __stdcall car(int a, int b, int c)
{
return a * b + c;
}
到目前为止的答案似乎不适用于这种使用 __stdcall 的函数。惯例。
知道为什么以及可以做些什么吗?

最佳答案

为此(即使用 decltype ),给定的 foo是不足够的。您需要类似以下特征的东西。

template<typename> struct funtion_args final {};

template<typename ReType, typename... Args>
struct funtion_args<ReType(Args...)> final
{
static constexpr std::size_t noArgs = sizeof...(Args);
};
二手 sizeof... the variadic template arguments, to get the no of arguments 上的运算符(operator).
然后你可以直接得到参数计数
std::cout << funtion_args<decltype(bar)>::noArgs << "\n"; // output: 2
或打包到 foo
template<typename signature>
constexpr std::size_t foo() noexcept
{
return funtion_args<signature>::noArgs;
}
( See Live Demo )

更好的方法
如果您想要更少的输入(即没有 decltype ),这是一种更方便的获取自由函数参数计数的方法,您可以执行以下操作
template <typename ReType, typename... Args> 
constexpr auto foo(ReType(*)(Args...)) noexcept
{
return sizeof...(Args);
}
现在您可以方便地调用 foo以其他函数作为参数
std::cout << foo(bar) << "\n"; // output: 2
( See Live Demo )

关于c++ - 如何从 `decltype(<funtion>)` 获取函数参数的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62827348/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com