标准::p空气的通用 lambda 参数



我试图看看这在 C++14 通用 lambda 中是否可行,但我找不到正确的表达方式(或者也许是不可能的)。简化的示例为:

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

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

如果这是一个模板参数,我可以显式显示pair,并将货币对的类型显示为通用,但我认为这不可能用 lambda 实现?因此,我将整个参数标记为通用,因此编译器似乎无法推断我正在传递映射emplace()的返回。

有什么办法可以做到这一点吗?

您可以使用

enable_if来约束lambda:

auto confirmOperation = [](auto pr) ->
    std::enable_if_t<std::is_same<decltype(pr.second), bool>::value> {
  assert(pr.second);
};

例。

您可以定义一个实现详细信息模板函数:

template<typename T>
void lambda_impl(std::pair<T, bool> const &p) {
  assert(p.second);
}

然后在您的 lambda 中将其调用为:

auto f = [](auto p) { lambda_impl(p); };

随着概念精简版的出现,以下方案将来可能会可用。目前它仅适用于 GCC:

auto f = [](std::pair<auto, auto> const &p) { assert(p.second); };

甚至更好:

auto f = [](std::pair<auto, bool> const &p) { assert(p.second); };

P.S Clang不编译是正确的,因为auto参数不是C++14的一部分。

似乎你可以在这里使用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);
}

现场示例

最新更新