给定具有以下结构的 lambda:
auto lambda_1 = [](int x, auto p) -> void {...};
auto lambda_2 = [](float x, auto p) -> int {...};
我想提取 x
的类型,以及返回类型,给定一个已知类型 p
.
返回类型相当简单,只要x
即可。是默认可构造的(我可以毫无问题地提出要求):
template<typename CB_T>
void foo(CB_T cb) {
using res_type = decltype(cb({}, std::declval<KnownP>()));
}
类似地,如果没有推断出第二个参数,我可以使用 function_traits 之类的东西轻松找到第一个参数的类型。 .
我知道我可以按照我想要的方式触发重载解析,正如我如何在不知道 x
的类型的情况下提取结果类型所证明的那样是的,所以我看不出有什么理由不能完成它。
感觉我掌握了每一 block 拼图,但我似乎无法弄清楚如何在该场景中获取重载函数的类型以提取 x
的类型.
有什么建议吗?
最佳答案
在您处理 lambda 的特定情况下:
- 接受两个参数:第一个是非模板,第二个是模板
- 具有对所有模板参数都有效的返回类型(例如,没有
enable_if
等)
然后您可以为第一个参数使用伪造的推导器类型:
struct arbitrary { template <class T> operator T(); };
using res = decltype(cb(arbitrary{}, std::declval<KnownP>()));
或者您可以使用 function_traits
来查找我们将要使用的特定 operator()
:
using oper = decltype(&CB_T::template operator()<KnownP>);
using arg0 = typename function_traits<oper>::template arg<0>::type;
using res = decltype(cb(std::declval<arg0>(), std::declval<KnownP>());
虽然两者都是特定于这个特定的 lambda 布局的。
关于c++ - 在不知道非模板化参数的参数类型的情况下重载模板化 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46652603/