你知道C++如何在一个函数内返回不同类型吗?
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++如何在一个函数内返回不同类型吗?的更多相关文章
- JAVA函数的返回值类型详解以及生成随机数的例题
函数的四要素:函数名.输入.输出(返回).加工. 函数分为两种:一种是有返回值得函数,一种是没有返回值的函数. 1. 定义:没有返回值的函数:(当我不需要函数的计算结果再拿出来进行运算的时候,我就不需 ...
- 利用jquery的$.Deferred方法在一个函数内获取另一个函数的返回值
使用场景:方法B需要方法A执行完成之后再执行,比如方法B中有用到方法A的变量:(需要引入jQuery1.5以后的版本) function A(){ var deffered = new $.Defer ...
- 函数中返回char *类型
记录一次比较容易引起混淆的地方. #include <stdio.h> char *str(void) { return "nihao\n"; } int main() ...
- js fuction函数内return一个内部函数详解
今天在网上,看到一篇关于js函数难点的文章,js函数的一些难点.在那上面提了一下,关于js函数返回另一个函数的问题,并附上了一道面试题: var add = function(x){ var sum ...
- PKG_COLLECTION_LHR 存储过程或函数返回集合类型
存储过程或函数可以返回集合类型,方法很多,今天整理在一个包中,其它情况可照猫画虎. CREATE OR REPLACE PACKAGE PKG_COLLECTION_LHR AUTHID CURREN ...
- php7函数,声明,返回值等新特性介绍
使用 ... 运算符定义变长参数函数 (PHP 5 >= 5.6.0, PHP 7) 现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数. functi ...
- Swift2.0语言教程之函数的返回值与函数类型
Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...
- MATLAB importdata函数返回值类型
importdata函数是MATLAB中I/O文件操作的一个重要函数.需要注意的是,针对不同的文件内容,importdata函数的返回值类型也有所不同. MATLAB帮助文档中的详细说明如下: Bas ...
- 请为main函数提供返回值
很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的.C/C++ 中从来没有定义过void main( ).C++ 之父 Bjarne Stroustrup 在他的主页上的 ...
- C++ 赋值函数为什么返回reference to *this?
赋值操作为什么要返回 reference to *this? 要弄清这个问题之前,先了解函数的返回值类型:返回值类型,返回引用类型 返回值类型:返回的是一个对象的副本. test operator= ...
随机推荐
- [python]使用diagrams绘制架构图
简介 diagrams是python的一个第三方库,用于实现使用代码绘制架构图. 安装 依赖于 Graphviz,安装diagrams之前需要先安装 Graphviz(下载压缩包后,将bin目录添加到 ...
- html5 2.0学习
列表定义:是一种特别的对象集合.集合:集中在一起合二为一(聚集). 聚集:多个列(信息资源)排在一起.信息资源:一堆数据,可能是字符,可能是图片. 列表分类:有序列表 无序列表 (自)定义列表 有 ...
- CodeForces 1367E Necklace Assembly
题意 给定一个字符串\(s\),长度为\(n\),一根项链为一个环,定义一根项链为\(k-beautiful\),则该项链顺时针转\(k\)下后与原项链相等,给出\(k\),请构造一根最长的\(k-b ...
- Storm整合Kafka Java API源码
1.Maven项目的pom.xml源码如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu ...
- KRPano插件一键解密大师 支持最新版KRPano XML/JS解密 ,支持分析下载静态/动态网站资源
KRPano插件一键解密大师,可以一键解密KRPano的XML/JS插件,并可以分析下载静态和动态网站的所有资源.软件下载安装即可使用,解密仅需鼠标一键点击即可,无需配置任何开发环境,方便全景开发人员 ...
- 西门子Teamcenter 许可分析
西门子Teamcenter 许可 绑定了主机名称,mac地址 另外,Teamcenter可以支持多个许可服务 所以.......................找个正式许可复制就可以 end succ ...
- JAVA动态增强一个BaseController的已经存在的接口
使用场景 前提场景 我们多个系统同时继承了某一个通用系统,通用系统的接口是不会允许随意改变的,其他子系统都依赖于Base系统的通用接口 目标需求场景 但是有一个业务,需要给某一个公共接口增加子系统独有 ...
- Go语言常用标准库——fmt
文章目录 fmt 向外输出 Print Fprint Sprint Errorf 格式化占位符 通用占位符 布尔型 整型 浮点数与复数 字符串和[]byte 指针 宽度标识符 其他falg 获取输入 ...
- Shuffle 题解
Shuffle 题目大意 给定一个长度为 \(n\) 的 01 序列 \(a\),你可以进行至多一次以下操作: 选定 \(a\) 的一个连续段,满足连续段内恰好有 \(k\) 个 \(1\),将该连续 ...
- wireshark数据包时间戳修改
1.数据包格式 两种数据包格式,pcap和pcapng两种.pcapng为升级版,时间戳细粒度更高. 2.时间戳位置(arrival time) 时间戳在数据包中表现为物理层的arrival time ...