Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载模板化lambda,而不知道非模板化参数的参数类型_C++_Templates_C++17 - Fatal编程技术网

C++ 重载模板化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()); } 类

给定具有以下结构的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());
}
类似地,如果没有推断出第二个参数,我可以很容易地使用类似的方法找到第一个参数的类型

我知道我可以按照我想要的方式触发重载解析,这可以从我在不知道
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>());