gpt4 book ai didi

c++ - 函数返回不同类型

转载 作者:行者123 更新时间:2023-11-27 22:36:15 26 4
gpt4 key购买 nike

给定一个 Base struct 和 Derived Structs,我想编写一个方法,可以根据某些输入返回它们中的任何一个,例如 int、string 等。

到目前为止,我尝试了各种代码片段,如下所示:

struct Base {
std::string name = "Base";
};

struct Derived1 : Base {
std::string name = "Derived1";
};

struct Derived2 : Base {
std::string name = "Derived2";
};

template<class T>
T string_to_struct(std::string s) {
if(s== "Derived1") {
return Derived1();
} else if(s == "Derived2") {
return Derived2();
} else {
return Base();
}
}

在 main 中我调用函数:

void test2() {
std::string s = "Derived1";
auto bb = string_to_struct<Base>(s);
std::cout << bb.name << std::endl;
}

现在,如果 s 匹配“Derived1”,我希望打印“Derived1”,如果它等于“Derived2”,则打印“Derived2”等等。但是,上面的代码不起作用,并且 string_to_struct 在任何情况下都会返回“Base”的实例。我该如何解决这个问题?

最佳答案

string_to_struct总是返回 Base按值(value)(因为你要求那个)。由于 bb 的静态类型是 Base , bb.name总是指 Base::name .由于您按值返回,因此 bb 的动态类型也将永远是Base .

你需要做两件事才能得到你想要的:

  1. 不通过Base返回多态对象值(value)。如果它们是在函数中创建的,则最佳返回值将是 std::unique_ptr<Base> .原因:您需要引用或指针才能让多态起作用。

  2. 不要使用依赖于对象的静态类型 的访问,例如.name .您想要使用 bb动态类型 ,使用虚拟方法最容易做到这一点,例如:

    virtual std::string getName() const

    这也是比依赖(非常脆弱的)名称隐藏更清洁的解决方案。

关于c++ - 函数返回不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53815866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com