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

标签 c++ templates c++17

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

相关文章:

c++ - std::cout 在 32/64 位下打印计时持续时间的不同结果

c++ - 使用 char 数组公钥的 OpenSSL 的 RSA 加密

c++ - 在 C++ 中使用类型名作为函数参数时如何传递引用?

C++ 模板 + 迭代器(菜鸟问题)

c++11 - 在签名中使用另一个成员模板函数的外线成员模板函数定义

c++ - 即使我在项目设置中更改了语言标准,为什么std::lcm()也不起作用?

c++ - 在 constexpr 构造函数中获取一个特殊的指针值(类似于 "second"nullptr)

c++ - 如何解决循环嵌套类定义的问题

c++ - 只读取文本文件中的给定行?

c++ - Windows 上的串行 (COM) 端口重新连接