是否有可能获得将根据 ADL 调用的函数的 decltype?

Is it possible to get the decltype of the function that would be called as per ADL?

a post here asking for what I believe is equivalent for my purposes (the address of the function as opposed to the type) but the question is already 5 years old; the sole answer 指出可能没有合适的解决方案 - 没有提出特定原因 - 并提供了一个部分解决方案,需要一个新函数显式调用每个有问题的 ADL 函数,以利用 lambda 语义。

template <typename T>
void (*get_swap())(T&, T&) {
    return [](T& x, T& y) { return swap(x, y); };
}

我可以让它更通用一些:

template<typename... T>
void (*get_func())(T &&... t) {
    return [](T &&... u) { return func(std::forward<T>(u)...); };
}

显然 func 也应该是一个参数 - 可能是一个模板参数 - 但它开始崩溃。

template<typename S, typename... T>
void (*get_func())(S (*func)(T &&...), T &&... t) {
    return [](T &&... u) { return func(std::forward<T>(u)...); };
}

答案继续使用 get_swap,如下所示:

auto f1 = get_swap<a::b>();

这似乎是路的尽头:f1 是通过函数的显式实例化来键入的; ADL出window.

考虑 std::make_tuple:您已经知道 std::make_tuple<T...> 可以在 T &&... t 上调用并且调用 std::make_tuple(std::forward<T>(t)...) 等同于在 T... 上显式实例化它。如果你不知道呢?也许一些模板参数是值,或者参数以某种方式打包,或者最好的候选者恰好包含一些带有默认值的额外参数。您可能会为 RTFM 争论不休,或者等待某种反思概念的出现,但我认为这是一个有效的问题;显然,编译器知道它通过 ADL 解析的函数的地址和类型。如果我将其添加为一项功能,我不知道从哪里开始语法(尽管我希望它遵循 declvaldecltype,也许 declfunc,返回最外层调用的类型。)

简而言之,我正在寻找的是一种询问方式,"what would you call if I supplied these arguments?" and/or "what is the type of what you would call (...)".

Meta:我故意遗漏了特定于版本的标签,以防新版本(或提案等)中可能存在解决方案。为了它的价值,我正在使用来自背景的 C++14主要是 C++11。这是一种学术兴趣,至少目前如此。另外,我的目标是中性语气,但如果听起来不是这样,我无意轻视我引用的答案的作者。

不,C++ 不公开这个。

如果您有实际用例,人们可以为潜在问题提供解决方法或解决方案。但是当您在抽象中要求一个非常具体的功能时,答案是 C++ 不提供该特定功能。

您可能可以重写编译器来执行此操作,但那样就不再是 C++ 了。