【问题标题】:How to pass value to std::optional in a structure?如何将值传递给结构中的 std::optional?
【发布时间】:2020-10-13 19:09:19
【问题描述】:

我正在尝试使用 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"

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

【问题讨论】:

  • 为这两个structs 定义一个构造函数可能会有所帮助。

标签: c++ optional


【解决方案1】:
person.pet = "Bru"

您的宠物字段不是字符串,而是Animal,因此您需要将Animal 实例传递给它。试试这个:

person.pet = Animal { "Bru" };

或者简单地说:

person.pet = { "Bru" };

【讨论】:

  • 这里我的动物结构有一个字段,即名称。如果我的 Animal 有多个参数,我如何传递参数,比如我的 Animal 有参数名称和颜色。那我怎么通过?
  • 使用逗号,例如person.pet = { "Name", "red" };。虽然我强烈建议添加构造函数,而不是使用这种隐式构造对象的方式。
  • 你能告诉我如何在这里使用构造函数吗?
  • 定义它们并使用它们。例如,在您的 Animal 中,您可以添加 Animal(const char *name) : name(name) {}。调用代码不变,{ "Bru" } 将调用真正的构造函数(如果可用)。
【解决方案2】:

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

当您创建 std::optional 实例时,一种选择是在适当的位置构建它。

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

或者,更神秘:

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

但是,由于@t.niese mentionedstd::make_optional 的优点之一是不需要模板参数,所以第二个选项不是那么好。

@Blindy's answer 也不错,我更喜欢在可用时使用std::make_* 函数,但我想在这种情况下应该不会有太大区别。

【讨论】:

  • make_* 函数背后的想法是无需指定模板参数。为什么要引入一个局部变量,如果你可以写std::make_optional(Animal{"Bru"});
  • @t.niese,是的,这更简单。
【解决方案3】:

我不确定你为什么要在这里使用 optional。但是你在做什么

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;
    }

    
}

【讨论】:

    猜你喜欢
    • 2021-09-25
    • 2021-11-29
    • 1970-01-01
    • 2019-05-10
    • 2022-12-31
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多