我试图看看这是否可能在C ++ 14泛型lambda中,但我找不到正确的方式来表达它(或者也许是不可能的)。简化的例子是:
auto confirmOperation = [](auto pr){
assert(pr.second);
};
我的想法是,如果你传递std::pair
,其中second
是bool
(例如从emplace
函数返回的内容),它可以查看这个布尔。
如果这是一个模板参数,我可以明确地将pair
显示为该对的类型为通用,但我不认为这是可能的lambda?因此,我将整个参数标记为通用,因此编译器似乎无法推断出我将其传递给地图emplace()
的返回。
有什么办法吗?
答案 0 :(得分:14)
您可以使用pyautogui.posistion() //returns tuple with mouse x and y values
// same for python 3.x
约束lambda:
enable_if
答案 1 :(得分:1)
您可以定义实现详细信息模板函数:
template<typename T>
void lambda_impl(std::pair<T, bool> const &p) {
assert(p.second);
}
然后在你的lambda中调用它:
auto f = [](auto p) { lambda_impl(p); };
随着Concepts-Lite的出现,将来可能会有以下方案。目前它仅适用于GCC:
auto f = [](std::pair<auto, auto> const &p) { assert(p.second); };
甚至更好:
auto f = [](std::pair<auto, bool> const &p) { assert(p.second); };
由于auto
参数不是C ++ 14的一部分,P.S Clang编译错误是正确的。
答案 2 :(得分:1)
好像你可以在这里使用is_same
和static_assert
:
[](auto pr){
static_assert(is_same_v<decltype(pr.second), bool>);
assert(pr.second);
};
或者如果C ++ 17不是一个选项,则需要向static_assert
发送消息,但您无法使用is_same_v
:
[](auto pr){
static_assert(is_same<decltype(pr.second), bool>::value, "ouch");
assert(pr.second);
}