有没有办法在编译时知道编译器选择了哪个版本的重载函数进行调用?

Is there a way to know at compile time, which version of an overloaded function has been chosen by the compiler to be called?

提问人:Aries Victor 提问时间:10/26/2023 最后编辑:Aries Victor 更新时间:10/26/2023 访问量:92

问:

一种可能的方法是使重载函数的返回类型存储特定函数的信息:

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;
}

问题是,我可能想知道某些预定义或标准函数的重载是解决的,因为我必须重写这些函数,这不是一个好主意。那么有没有更有效的方法来实现这一目标呢?

C++ 重载 重载解决方法

评论

3赞 Ulrich Eckhardt 10/26/2023
重载解析是在编译时完成的,而不是在运行时完成的,所以你的问题标题有点误导。
9赞 Pepijn Kramer 10/26/2023
对我来说看起来像一个 XY 问题。您遇到的实际问题是什么?正确的函数是在编译时确定的,并且该选择的规则是明确定义的。我也没有直接看到需要你声明的结构,你的模板函数可以返回auto
2赞 463035818_is_not_an_ai 10/26/2023
您可以选择一个要手动调用的重载。尽管您不需要知道调用了哪个过载,但首先是提供过载的原因之一。你为什么需要知道?
1赞 n. m. could be an AI 10/26/2023
编译器在编译时通过遵循重载解析算法来确定要调用的函数。原则上,任何人都可以遵循相同的算法并得出相同的结果。
1赞 Aries Victor 10/26/2023
@HolyBlackCat 在函数模板中。

答:

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)