gpt4 book ai didi

c++ - 在不知道非模板化参数的参数类型的情况下重载模板化 lambda

转载 作者:行者123 更新时间:2023-11-28 04:58:28 25 4
gpt4 key购买 nike

给定具有以下结构的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com