是否有可能获得将根据 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 解析的函数的地址和类型。如果我将其添加为一项功能,我不知道从哪里开始语法(尽管我希望它遵循 declval
和 decltype
,也许 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++ 了。
有 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 解析的函数的地址和类型。如果我将其添加为一项功能,我不知道从哪里开始语法(尽管我希望它遵循 declval
和 decltype
,也许 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++ 了。