gpt4 book ai didi

c++ - 重建仅知道其名称和参数列表的函数的签名

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

我正在编写一些带有函数名称并执行一些操作的宏,其中之一是通过 decltype 获取其签名并将其用作模板参数。

我想扩展这些宏以支持重载函数。我的想法是让他们接受一个额外的参数来指定参数列表而不是完整的签名,因为两个函数重载不能只在返回类型上不同。当我尝试重建函数的完整签名时出现问题,就像我在非重载情况下使用 decltype 所做的那样:我如何猜测返回类型?

我试过 result_of,但没有成功:

#include <type_traits>
#include <typeinfo>
#include <iostream>
using namespace std;

double f(int, int);
int f(int, int, int);

int main(){
cout<<typeid(result_of<decltype(&f)(int,int, int)>::type).name()<<endl;
}

如果 double f(int, int) 被注释掉,则代码段有效。我知道这是因为在 decltype 中,不知道要选择两个重载中的哪一个。通常,人们会在与所需重载相匹配的签名前添加一个虚拟强制转换,但这意味着您提前知道返回类型,因此所有这些东西都是无用的。

有没有办法解决这个问题,还是我必须强制用户在宏中指定完整的签名?

编辑:基本上,我有这两个宏:

//add a member function as a method
#define addmethod2(stringname, methodname) fields[#stringname]=method_helper<decltype(&hold_type::methodname), &hold_type::methodname>::worker
#define addmethod(methodname) addmethod2(methodname, methodname)

我想添加第三个,addmethod3,它参数列表(如果它是具有返回类型的完整签名,那将是微不足道的),在以便选择正确的成员函数重载。

最佳答案

怎么样

template<typename T>
struct identity { typedef T type; };

template<typename T>
using NoDeduce = typename identity<T>::type;

template<typename T>
using Identity = T;

template<typename ...P, typename R>
Identity<R(P...)> *get_f(R f(NoDeduce<P>...)) {
return f;
}

然后你可以说

auto *f1 = get_f<int, int, int>(f);
auto *f2 = get_f<int, int>(f);

关于c++ - 重建仅知道其名称和参数列表的函数的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10376337/

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