gpt4 book ai didi

C++ 从函数签名中提取参数

转载 作者:行者123 更新时间:2023-11-30 04:50:34 25 4
gpt4 key购买 nike

给定签名的模板函数

template <typename F>
void fn(F f);

如果给fn()一个可调用函数,我想提取给定函数签名F的参数包。

foo0() 不同,我无法在以下示例中的 foo1()foo2() 中执行此操作(已简化)到单个参数而不是参数包):

#include <type_traits>

template <typename Sig> struct argument_of;
template <typename R, typename Arg> struct argument_of<R(Arg)> { typedef Arg type; };

void bar(int);

void foo0() {
static_assert(std::is_same<int, typename argument_of<decltype(bar)>::type>::value, "!");
}

template <typename F>
void foo1(F) {
static_assert(std::is_same<int, typename argument_of<F>::type>::value, "!");
}

template <typename F>
void foo2(F f) {
static_assert(std::is_same<int, typename argument_of<decltype(f)>::type>::value, "!");
}

int main() {
foo0();
foo1(bar);
foo2(bar);
}

参见 live示例。

如果 fn() 的调用方式与 foo1()foo2() 的调用方式相同,正确的方法是什么?上面的例子?

最佳答案

你只需要一个专门化来处理函数指针类型:

template <typename Sig> struct argument_of;
template <typename R, typename Arg> struct argument_of<R(Arg)> { typedef Arg type; };
template <typename R, typename Arg> struct argument_of<R(*)(Arg)> { typedef Arg type; };

这是一个很小的区别,我希望我的术语正确,但是符号 bar 是一个非重载的函数键入 void(int)变量 f(或未命名的 F 参数)是一个 void(*)(int) 类型的函数指针。 C++ 中的变量和函数根本不同,类型系统也有这种区别。

还值得注意的是,您可能希望专攻的另一种变体是函数引用,它看起来像void(&)(int)。在类似 decltype(*f)decltype((bar)) 的情况下可以推导出函数引用类型(注意额外的括号)。

关于C++ 从函数签名中提取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54953802/

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