我试图看看这在 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_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);
}
现场示例