C++如何在一个函数内返回不同类型(三种方法)

 更新时间:2023年12月01日 08:57:40   作者:架构师老卢  
C++ 中要在一个函数内返回不同类型的值,你可以使用 C++17 引入的 std::variant 或 std::any,或者使用模板和多态,下面将分别介绍这些方法,需要的朋友可以参考下

C++ 中要在一个函数内返回不同类型的值,你可以使用 C++17 引入的 std::variant 或 std::any,或者使用模板和多态。下面将分别介绍这些方法。

方法一:使用 std::variant

std::variant 允许你在一个函数内返回不同类型的值,但它要求所有可能的返回类型都在一个有限的集合中,你需要提前定义这个集合。

首先,包括 <variant> 头文件:

#include <variant>

然后,使用 std::variant 来定义函数的返回类型:

std::variant<int, double, std::string> GetDifferentValue(int choice) {
    if (choice == 0) {
        return 42;
    } else if (choice == 1) {
        return 3.14;
    } else {
        return "Hello, World!";
    }
}

在这个示例中,GetDifferentValue 函数可以返回 int、double 或 std::string,具体返回哪种类型取决于 choice 参数的值。

方法二:使用 std::any

std::any 允许你在一个函数内返回不同类型的值,而无需提前定义可能的返回类型。但在使用 std::any 时,你需要小心类型安全和类型转换。

首先,包括 <any> 头文件:

#include <any>

然后,使用 std::any 来定义函数的返回类型:

std::any GetDifferentValue(int choice) {
    if (choice == 0) {
        return 42;
    } else if (choice == 1) {
        return 3.14;
    } else {
        return "Hello, World!";
    }
}

在这个示例中,GetDifferentValue 函数可以返回任何类型的值。

方法三:使用模板和多态

另一种方式是使用模板和多态,这样你可以在运行时动态确定返回的类型。这通常需要创建一个基类,派生出具体类型的子类,并使用基类指针或智能指针进行返回。

#include <iostream>
#include <memory>
class Base {
public:
    virtual void print() const = 0;
};
class IntType : public Base {
public:
    IntType(int value) : value(value) {}
    void print() const override {
        std::cout << "Int: " << value << std::endl;
    }
private:
    int value;
};
class DoubleType : public Base {
public:
    DoubleType(double value) : value(value) {}
    void print() const override {
        std::cout << "Double: " << value << std::endl;
    }
private:
    double value;
};
class StringType : public Base {
public:
    StringType(const std::string& value) : value(value) {}
    void print() const override {
        std::cout << "String: " << value << std::endl;
    }
private:
    std::string value;
};
std::unique_ptr<Base> GetDifferentValue(int choice) {
    if (choice == 0) {
        return std::make_unique<IntType>(42);
    } else if (choice == 1) {
        return std::make_unique<DoubleType>(3.14);
    } else {
        return std::make_unique<StringType>("Hello, World!");
    }
}
int main() {
    auto value = GetDifferentValue(2);
    value->print();
    return 0;
}

在这个示例中,GetDifferentValue 返回一个指向 Base 基类的智能指针,而 Base 有多个派生类,代表不同的返回类型。

以上是三种在 C++ 中返回不同类型的方法,你可以根据具体需求选择其中之一。

到此这篇关于你知道C++如何在一个函数内返回不同类型吗?的文章就介绍到这了,更多相关C++一个函数内返回不同类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux之sed命令的用法

    linux之sed命令的用法

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
    2013-10-10
  • C++中构造函数的参数缺省的详解

    C++中构造函数的参数缺省的详解

    这篇文章主要介绍了C++中构造函数的参数缺省的详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • C++函数指针详解

    C++函数指针详解

    这篇文章主要介绍了C++函数指针详解,通过文字描述C++函数指针基础概念,内涵详细的代码实现和解析,希望对你能够有所帮助
    2021-06-06
  • OpenCV实现图像切割功能

    OpenCV实现图像切割功能

    这篇文章主要为大家详细介绍了OpenCV实现图像切割功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C++使用循环计算标准差的代码实现

    C++使用循环计算标准差的代码实现

    在C++中,计算标准差可以使用循环来实现,本文给大家介绍了一个示例代码,演示了如何使用循环计算标准差,文中示例代码介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-12-12
  • C++如何过滤出字符串的中文(GBK、UTF-8)

    C++如何过滤出字符串的中文(GBK、UTF-8)

    这篇文章主要给大家介绍了关于C++如何过滤出字符串的中文的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • C语言控制台实现字符飞机大战

    C语言控制台实现字符飞机大战

    这篇文章主要为大家详细介绍了C语言控制台实现字符飞机大战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 数据结构 中数制转换(栈的应用)

    数据结构 中数制转换(栈的应用)

    这篇文章主要介绍了数据结构 中数制转换(栈的应用)的相关资料,需要的朋友可以参考下
    2017-06-06
  • C语言实现任何文件的加密解密功能

    C语言实现任何文件的加密解密功能

    这篇文章主要为大家详细介绍了C语言实现任何文件的加密解密功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C++OOP对象和类的详细讲解

    C++OOP对象和类的详细讲解

    这篇文章主要介绍了C++面相对象编程中的类与对象的特性与概念,OOP面向对象语言相对C语言这样面相过程的语言来说具有类和对象以及方法这样的特性,需要的朋友可以参考下
    2021-08-08

最新评论