gpt4 book ai didi

c++ - 如何从参数中获取函数签名?

转载 作者:行者123 更新时间:2023-12-01 14:25:15 50 4
gpt4 key购买 nike

假设我有一个像这样的函数 f:

void f(int x) {
cout << "Hi I'm f" << endl;
}

auto x = f;

但是如果函数重载了,这就不行了:

void f(int x) {}
void f(int x, const int y) {}

auto x = f; // Which one to use ?

所以这是不可能的。但是让我们假设我知道我将向函数传递哪些参数,例如我知道我想调用f(10, 20)。不是参数本身的类型,而是实际值,它们可能在常量性、引用性(假设这个词存在......)或什至通过强制转换的不同类型上有所不同。在示例中,20int&& 并且参数 const int 是可绑定(bind)的。我还假设没有边缘情况,并且值只能绑定(bind)到一个重载,即使直接调用也无法编译。是否可以推断出重载函数的地址和函数的签名?

伪代码:

Input: Values of arguments
Output: Address of overloaded function `f` OR function signature type (any one can be deduced from the other though)

明明可以直接调用,但是函数确实“偷偷摸摸”直接被调用了,看起来不可能被引用。

template<typename... Args>
void callMeMaybe(Args... args) {
f(args...); // I can call f... But how to get f itself ?
auto x = static_cast<void(Args...)>(f) // does not works because f could differ in argument bind
}

最佳答案

调用哪个函数取决于您正确提到的参数的引用性/常量性。您必须明确地告诉编译器签名,然后您才能获得函数指针。有趣的是,这也适用于模板。

#include<iostream>

template<typename Name1, typename Name2, typename Name3>
Name3 f(Name1, Name2, Name3);

int f(int);
int f(int,int const);

using namespace std;

int main()
{
//Type deduction using decltype: the args must be constexpr.
//Remember there is no runtime-reflection support in c++ yet.
auto s = static_cast< int (*)(decltype(78), decltype(-98) ) > (f);
cout << s(78, -98) << endl;
cout << typeid(s).name() << endl;

// x and y will point to the same function
// int (*)(int) and int (*)(const int) are equivalent overloads
auto x = static_cast<int (*)(int)>( f );
auto y = static_cast<int (*)(int const)>( f );

//p and q will point to the same function
// int (*)(int, int) and int (*)(int, const int) are equivalent overloads
auto p = static_cast<int (*)(int, int const)>( f );
auto q = static_cast<int (*)(int, int)>( f );

//With templates
auto z = static_cast<string (*)(int, char, string)>( f );
cout << z(4,'a',"Hello!!") << endl;

//typeid to check signatures
cout << typeid(x).name() << endl;
cout << typeid(y).name() << endl;
cout << typeid(p).name() << endl;
cout << typeid(q).name() << endl;
cout << typeid(z).name() << endl;

return 0;
}

int f(int arg)
{
return arg;
}

int f(int a1, int const a2)
{
return a2; //Return the second element
}

template<typename Name1, typename Name2, typename Name3>
Name3 f(Name1 a, Name2 b, Name3 c)
{
return c; // Return the 3rd element
}

关于c++ - 如何从参数中获取函数签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62436899/

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