C++ 重载模板化lambda,而不知道非模板化参数的参数类型
给定具有以下结构的lambda:C++ 重载模板化lambda,而不知道非模板化参数的参数类型,c++,templates,c++17,C++,Templates,C++17,给定具有以下结构的lambda: auto lambda_1 = [](int x, auto p) -> void {...}; auto lambda_2 = [](float x, auto p) -> int {...}; 我想提取x的类型,以及给定p的已知类型的返回类型 只要x是默认可构造的(我可以毫无问题地提出要求),返回类型就相当简单: 模板 无效foo(CB_T CB){ 使用res_type=decltype(cb({},std::declval()); } 类
auto lambda_1 = [](int x, auto p) -> void {...};
auto lambda_2 = [](float x, auto p) -> int {...};
我想提取x
的类型,以及给定p
的已知类型的返回类型
只要x
是默认可构造的(我可以毫无问题地提出要求),返回类型就相当简单:
模板
无效foo(CB_T CB){
使用res_type=decltype(cb({},std::declval());
}
类似地,如果没有推断出第二个参数,我可以很容易地使用类似的方法找到第一个参数的类型
我知道我可以按照我想要的方式触发重载解析,这可以从我在不知道x
的类型的情况下如何提取结果类型中得到证明,因此我认为没有理由不能实现这一点
感觉上我已经掌握了所有的谜题,但我似乎无法理解如何在该场景中获取重载函数的类型,以便提取x
的类型
有什么建议吗?在您与Lambda打交道的特定情况下:
- 以两个参数为例:第一个参数是非模板参数,第二个参数是模板参数
- 具有对所有模板参数有效的返回类型(例如,如果,则没有启用_等)
struct arbitrary { template <class T> operator T(); };
using res = decltype(cb(arbitrary{}, std::declval<KnownP>()));
不过,这两个都是特定于此特定lambda布局的 你想解决的实际问题是什么?总的来说,如果没有反思,这是不可能的。特别是对于形式为
[](T,auto)
的lambda,没有SFINAE骗局,这是可能的,但这似乎特别特别。@Barry,是啊。。。晦涩难懂的我需要这样做,以便在调用lambda之前分配一个临时缓冲区,作为对模板化子进程的引用传递给它以填充。我需要模板化第二个参数,因为实际类型将非常不透明,我真的不想将其强加给用户(我还希望lambda可以与不同的不透明类型一起重用)@Barry我实际上希望能够接受任意函子,而不仅仅是lambdas,但是如果必要的话,要求用户在lambdas中包装函子是可以接受的。(我真的很想支持闭包)decltype(&CB\u T::template operator())
Doy!为什么我没有想到这个?这正是我想要的。我马上就来试试。就具体的结构而言,使用任意{}
而不仅仅是{}
有什么特别的原因吗。实际上,我希望允许2-3种不同的参数配置,但我应该能够使用std::is_invocable
@Frank对其进行排序。如果类型不是默认的副本列表可初始化类型,则不能使用{}
<代码>任意的就行了。
struct arbitrary { template <class T> operator T(); };
using res = decltype(cb(arbitrary{}, std::declval<KnownP>()));
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>());