C++ 我如何制作C++;从lambda推断模板类型参数?

C++ 我如何制作C++;从lambda推断模板类型参数?,c++,templates,lambda,c++17,type-inference,C++,Templates,Lambda,C++17,Type Inference,这是我的代码: #包括 结构项{ int-val; }; 结构XItem{ int-val; }; 无效转换(常量项和i、XItem和目标){ target.val=i.val; } 模板 无效显示(const T&v){ std::cout问题是,中没有考虑隐式转换(从lambda到函数指针),这导致无法推导模板参数 类型演绎不考虑隐式转换(除了上面列出的类型调整):这是以后发生的工作。 您可以显式指定模板参数以绕过推断 handleRequest<XItem, ResItem>(

这是我的代码:

#包括
结构项{
int-val;
};
结构XItem{
int-val;
};
无效转换(常量项和i、XItem和目标){
target.val=i.val;
}
模板
无效显示(const T&v){

std::cout问题是,中没有考虑隐式转换(从lambda到函数指针),这导致无法推导模板参数

类型演绎不考虑隐式转换(除了上面列出的类型调整):这是以后发生的工作。

您可以显式指定模板参数以绕过推断

handleRequest<XItem, ResItem>(i, [](const XItem &x) {
  return ResItem{x.val};
});

关于
auto p=transform(cur);auto res=cb(p);
?如果您需要函数上下文中的类型,您可以在实际代码中另外使用
decltype
@super,我会有多个转换,比如
A transform(const Item&){…},
B transform(const Item&){…}
这将是非法的。在这种情况下,提取具有类型特征的类型是更惯用的方法。保持代码更通用,而不需要传递函数指针。特别是因为这将限制您在不捕获的情况下使用lambdas。@super请注意,
handleRequest
的主体被大大简化。在实际代码中,
>变换(cur,p);
is
cur.get_到(p)
这限制了我的可能性。我给出正文是为了展示我如何使用类型,而不是为了得到关于如何不在那里使用类型的建议,如果不清楚的话,我很抱歉。
操作符+
正是我要找的,因为我不需要显式地给出类型。@flyx您可能需要参考关于
操作符+
m的内容agic有。请注意,只有非捕获lambda才能转换为函数指针。谢谢。对于我的用例,仅使用非捕获lambda是完全可行的。
handleRequest<XItem, ResItem>(i, [](const XItem &x) {
  return ResItem{x.val};
});
handleRequest(i, static_cast<RestItem(*)(const XItem&)>([](const XItem &x) {
  return ResItem{x.val};
}));
handleRequest(i, +[](const XItem &x) {
  return ResItem{x.val};
});