std :: pair的通用lambda参数

时间:2016-06-10 13:04:30

标签: c++ c++14

我试图看看这是否可能在C ++ 14泛型lambda中,但我找不到正确的方式来表达它(或者也许是不可能的)。简化的例子是:

auto confirmOperation = [](auto pr){
  assert(pr.second);
};

我的想法是,如果你传递std::pair,其中secondbool(例如从emplace函数返回的内容),它可以查看这个布尔。

如果这是一个模板参数,我可以明确地将pair显示为该对的类型为通用,但我不认为这是可能的lambda?因此,我将整个参数标记为通用,因此编译器似乎无法推断出我将其传递给地图emplace()的返回。

有什么办法吗?

3 个答案:

答案 0 :(得分:14)

您可以使用pyautogui.posistion() //returns tuple with mouse x and y values // same for python 3.x 约束lambda:

enable_if

Example

答案 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_samestatic_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);
}

Live Example