提问人:Aries Victor 提问时间:10/26/2023 最后编辑:Aries Victor 更新时间:10/26/2023 访问量:92
有没有办法在编译时知道编译器选择了哪个版本的重载函数进行调用?
Is there a way to know at compile time, which version of an overloaded function has been chosen by the compiler to be called?
问:
一种可能的方法是使重载函数的返回类型存储特定函数的信息:
template<class _ret_t, class _func_t>
struct tpinf
{
using ret_t = _ret_t;
using func_t = _func_t;
ret_t value;
};
tpinf<int, int(*)(double)> func(int n) { ... }
tpinf<int, int(*)(char)> func(char c) { ... }
int main()
{
int n = 56;
using resolved_function_type = decltype(func(n))::func_t;
auto v = func(n).value; // access returned object
return 0;
}
问题是,我可能想知道某些预定义或标准函数的重载是解决的,因为我必须重写这些函数,这不是一个好主意。那么有没有更有效的方法来实现这一目标呢?
答:
2赞
Caleth
10/26/2023
#1
您可以在所需的重载明确的上下文中获取重载函数的地址。
int func(int);
int func(char);
int main()
{
int n = 56;
int (*pfunc)(int) = func; // pfunc is a pointer to 'int func(int)'
return 0;
}
评论
1赞
463035818_is_not_an_ai
10/26/2023
不仅歧义,而且隐式转换也限制了这种方法 godbolt.org/z/dnxfo3WjW
0赞
Caleth
10/26/2023
@463035818_is_not_an_ai嗯,有点误导decltype
1赞
463035818_is_not_an_ai
10/26/2023
好的,但这是手动选择重载,这当然是可能的。但 OP 希望通过重载分辨率来推断选择的重载。这就是为什么我喜欢答案的原因,它做到了 OP 要求的,只是有局限性。现在你需要提前知道要选择什么过载decltype(n)
上一个:过载解决方法中的混淆
下一个:重载重写的方法
评论
auto