相关疑难解决方法(0)

如何展平嵌套的 std::optional?

注意:这个问题被简要标记为this的重复,但它不是一个完全重复的,因为我专门询问 std::optionals 。如果您关心一般情况,仍然是一个值得阅读的好问题。

假设我有嵌套的选项,像这样(愚蠢的玩具示例):

struct Person{
    const std::string first_name;
    const std::optional<std::string> middle_name;
    const std::string last_name;
};
struct Form{
    std::optional<Person> person;
};
Run Code Online (Sandbox Code Playgroud)

和这个垃圾邮件功能:

void PrintMiddleName(const std::optional<Form> form){
    if (form.has_value() && form->person.has_value() && form->person->middle_name.has_value()) {
        std::cout << *(*(*form).person).middle_name << std::endl; 
    } else {
        std::cout << "<none>"  << std::endl; 
    }
}
Run Code Online (Sandbox Code Playgroud)

展平此可选检查的最佳方法是什么?我做了这样的东西,它不是可变参数,但我不太关心(membr3如果真的有必要,我可以再添加一个级别(用 重载),除此之外的一切都是糟糕的代码)。

template<typename T, typename M>
auto flatten_opt(const std::optional<T> opt, M membr){
    if (opt.has_value() && (opt.value().*membr).has_value()){
        return std::optional{*((*opt).*membr)};
    }
    return decltype(std::optional{*((*opt).*membr)}){};
}

template<typename T, typename M1, typename M2> …
Run Code Online (Sandbox Code Playgroud)

c++ c++20 stdoptional

19
推荐指数
3
解决办法
888
查看次数

为什么std :: shared_ptr dereference没有抛出空指针异常(或类似)?

例外是C++的一个重要部分,使用它的原因之一(我知道有许多,更重要,其他原因)是避免不必要的检查,用大量if语句混淆代码(也许这是一个不正确的假设?) .

所以现在我很好奇为什么std::shared_ptr::operator*std::shared_ptr::operator->不扔一个null_ptr_exception或类似?

c++ exception

10
推荐指数
2
解决办法
1984
查看次数

标签 统计

c++ ×2

c++20 ×1

exception ×1

stdoptional ×1