如何在结构中将值传递给 std::optional?

How to pass value to std::optional in a structure?

我正在尝试使用 std::optional,如下面的代码所示。

#include <iostream>
#include <optional>
#include <string>

struct Animal {
    std::string name;
};

struct Person {
    std::string name;
    std::optional<Animal> pet;
};

int main() {
    Person person;
    person.name = "John";
    
    if (person.pet) {
        std::cout << person.name << "'s pet's name is " <<
            person.pet->name << std::endl;
    }
    else {
        std::cout << person.name << " is alone." << std::endl;
    }
}

我想知道如何将值传递给作为结构的可选参数 pet。 我试过

person.pet = std::make_optional<Animal>("Bru");

person.pet = "Bru"

但这两个都不行。我应该如何将值传递给我的参数?

person.pet = "Bru"

您的 pet 字段不是字符串,它是一个 Animal,因此您需要向其传递一个 Animal 实例。试试这个:

person.pet = Animal { "Bru" };

或者简单地说:

person.pet = { "Bru" };

您正试图用 char array 构造一个 Animal 对象,但不能那样做。

一个选项是在创建 std::optional 实例时就地构建它。

person.pet = std::make_optional(Animal{"Bru"});

或者,更神秘:

person.pet = std::make_optional<Animal>({{"Bru"}});

但是,由于 std::make_optional 的优点之一是不需要模板参数,所以第二个选项不太好。

也不错,我确实更喜欢在可用时使用 std::make_* 函数,但我想在这种情况下应该没有太大区别。

我不确定你为什么要在这里使用可选的。然而你在做什么

person.pet = "Bru"

正在将 person.pet 设置为一个字符串,当您有

 std::optional<Animal> pet;

这样你实际上是将 pet 设置为动物结构。

所以要得到你想要的东西,你需要像这样声明一个新的动物对象。

int main() {
    Person person;
    person.name = "John";

    Animal _animal;
    _animal.name = "bru"; 
    person.pet = _animal;

    if (person.pet) {
        std::cout << person.name << "'s pet's name is " <<
            person.pet->name << std::endl;
    }
    else {
        std::cout << person.name << " is alone." << std::endl;
    }

    
}