[英]Is it possible to get the decltype of the function that would be called as per ADL?
这里有一个帖子,询问我认为对我而言等效的内容(函数的地址而不是类型),但问题已经有5年了; 唯一的答案指出,可能没有一个适当的解决方案-如果没有提出特定的原因-并提供了一个部分解决方案,该解决方案要求一个新函数显式地调用每个有问题的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不在窗外。
考虑一下std::make_tuple
:您已经知道std::make_tuple<T...>
可在T &&... t
上调用,并且正在调用std::make_tuple(std::forward<T>(t)...)
等效于在T...
上显式实例化它。 如果您不知道该怎么办? 也许某些模板参数是值,或者这些参数以某种方式打包,或者最佳候选恰好包括一些带有默认值的额外参数。 您可能会为RTFM争论,或者等待某种反射概念来临,但我认为这是一个有效的问题。 显然,编译器知道通过ADL解析的函数的地址和类型。 如果我将其添加为一项功能,我将不知道从语法开始的位置(尽管我希望它遵循declval
和decltype
可能是declfunc
,返回最外层调用的类型。)
简而言之,我正在寻找的是一种询问方式:“如果提供这些参数,您会叫什么?” 和/或“您所说的是什么类型(...)”。
Meta:如果有解决方案可能存在于较新版本(或提案等)中,我有意遗漏了特定于版本的标记,对于它的价值,我使用的C ++ 14主要来自C ++ 11。 这是一个学术兴趣,至少目前是这样。 此外,我的目标是保持中立,但如果听起来不正确,我无意向我引用我所引用答案的作者。
不,C ++不会公开这一点。
如果您有一个实际的用例,那么人们可以为潜在的问题提供解决方法或解决方案。 但是,当您在摘要中要求一个非常特定的功能时,答案是C ++没有提供该特定功能。
您可能会重写编译器来执行此操作,但是那样就不再是C ++。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.