c++ - 我可以将 std::map 迭代器解包到可选项的结构化绑定(bind)吗?

标签 c++ c++17 c++20 structured-bindings

考虑以下代码:

#include<functional>
#include<iostream>
#include<map>

const std::map<int, std::string> numberToStr{{1, "one"}, {2,"two"}};
int main() {
    auto it = numberToStr.find(2);
    if (it ==numberToStr.end()){
        return 1;
    }
    const auto&[_, str] = *it;
    std::cout << str;
}

我有什么办法可以将可能取消引用的 it 解包为 2 个可选值(_ 和 str),这样我就可以写:

const auto&[_, str] = // some magic;
// _ is std::optional<int>, str is std::optional<str>
if (!str){
    return 1;
}
std::cout << *str;
}

我认为不是,因为结构化绑定(bind)是语言级别的东西,而 std::optional 是一个库功能,据我所知,没有办法自定义交互。

注意:我假设我可以实现我自己的映射,它返回知道它们是否指向 .end() 的迭代器,并且“破解”自定义点以基于此执行可选逻辑,我要求一般用例,当我不控制容器。

最佳答案

你可以添加一个辅助函数,比如

template <typename Key, typename Value, typename... Rest>
std::pair<std::optional<Key>, std::optional<Value>> my_find(const std::map<Key, Value, Rest...>& map, const Key& to_find)
{
    auto it = map.find(to_find);
    if (it == map.end())
        return {};
    else
        return {it->first, it->second};
}

然后你会像这样使用它

const auto&[_, str] = my_find(numberToStr, 2);
// _ is std::optional<int>, str is std::optional<str>
if (!str){
    return 1;
}
std::cout << *str;

如果你只关心这个值,你可以通过返回它来缩短代码一点

template <typename Key, typename Value, typename... Rest>
std::optional<Value> my_find(const std::map<Key, Value, Rest...>& map, const Key& to_find)
{
    auto it = map.find(to_find);
    if (it == map.end())
        return {};
    else
        return {it->second};
}

然后你会像这样使用它

auto str = my_find(numberToStr, 2);
// str is std::optional<str>
if (!str){
    return 1;
}
std::cout << *str;

关于c++ - 我可以将 std::map 迭代器解包到可选项的结构化绑定(bind)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65130017/

相关文章:

c++ - 是否可以在 cpp20 中创建范围 vector

c# - 在 C++ 中将 int 转换为 little-endian 格式的字节以用于 Azure 中的 blobId

c++ - 在 Linux 上快速高效地绘制像素阵列

c++ - 为什么它没有进入 if 条件?

c++ - 您如何确保调用 Derived 析构函数?

visual-c++ - const std::wstring 是如何编码的以及如何更改为 UTF-16

c++ - 如何将数组部分初始化为某个默认值?

c++ - 在匿名命名空间中定义自定义相等运算符

c++ - 对或元组值的名称别名引用

c++ - 两个日期之间的秒数,包括闰秒