是否有可能获得将根据ADL调用的函数的十进制类型?

时间:2018-06-29 11:40:26

标签: c++ template-meta-programming argument-dependent-lookup

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的形式跟随decltypedeclfunc并返回最外层调用的类型。)

简而言之,我正在寻找的是一种询问方式:“如果提供这些参数,您会怎么称呼?”和/或“您叫什么类型(...)”。

元:如果有解决方案可能存在于较新版本(或提案等)中,我特意省略了特定于版本的标记。出于其价值,我使用的C ++ 14主要来自C ++ 11。这是一个学术兴趣,至少目前是这样。另外,我的目标是保持中立的语气,但如果听起来听起来不对,我无意轻描淡写我引用的答案。

1 个答案:

答案 0 :(得分:0)

不,C ++不会公开这一点。

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

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