有a post here询问我认为对我而言是等效的内容(函数的地址而不是类型),但问题已经有5年了; 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在窗外。
考虑std::make_tuple
:您已经知道std::make_tuple<T...>
可在T &&... t
上调用,并且调用std::make_tuple(std::forward<T>(t)...)
等效于在T...
上实例化它。如果您不知道该怎么办?也许某些模板参数是值,或者这些参数以某种方式打包,或者最佳候选恰好包括一些带有默认值的额外参数。您可能会为RTFM争论,或者等待某种反射概念来临,但我认为这是一个有效的问题。显然,编译器知道通过ADL解析的函数的地址和类型。如果我将其添加为一项功能,我将不知道从语法的角度开始(尽管我希望它以declval
的形式跟随decltype
和declfunc
并返回最外层调用的类型。)
元:如果有解决方案可能存在于较新版本(或提案等)中,我特意省略了特定于版本的标记。出于其价值,我使用的C ++ 14主要来自C ++ 11。这是一个学术兴趣,至少目前是这样。另外,我的目标是保持中立的语气,但如果听起来听起来不对,我无意轻描淡写我引用的答案。
答案 0 :(得分:0)
不,C ++不会公开这一点。
如果您有实际的用例,人们可以提供解决方法或解决潜在问题的方法。但是,当您在摘要中要求一个非常特定的功能时,答案是C ++没有提供该特定功能。
您可能会重写编译器来执行此操作,但是那样就不再是C ++。