c++ 把类型作为参数
实际上,标题是错误的,C/C++是无法把类型作为参数的,但是可以使用模板技术来实现!。来看个例子:
#include <iostream>
#include <typeinfo>
using namespace std;template <typename T, typename VAL>
ostream &check(int line, VAL val, ostream &out=cout){if(typeid(T) == typeid(VAL))out << line << " true " << " ";elseout << line << " false " << " ";return out;
}
这个函数的目的就是判断val
的类型VAL
是否和T
相同。调用:
int main(){int a = 1;double b = 2;std::cout << type_name(a) << endl;check<int>(__LINE__, a) << endl;check<int>(__LINE__, b) << endl;return 0;
}
输出:
59 true
60 false
check<int>(__LINE__, a)
的<int>
使T被推断为int
(<int>
里的int
为显示模板实参,会使模板参数列表<typename T, typename VAL>
中的第一个模板参数T
推断为int
);通过参数a
推断出VAL是int
,所以typeid(T) == typeid(VAL)
为真。
check<int>(__LINE__, b)
的<int>
使T被推断为int
(同上);通过参数b
推断出VAL是double
,所以typeid(T) == typeid(VAL)
为假。
gcc/clang通过typeid(var).name()
来获取变量var
的类型字符串是不正确的,故补充一个可以正常获取变量类型的字符串的函数type_name
:
#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
using namespace std;template <typename VAL>
string type_name(VAL &val){int status;char* real_name;real_name = abi::__cxa_demangle(typeid(VAL).name(), nullptr, nullptr, &status);string s(real_name);free(real_name);real_name = nullptr;return s;
}int main(){int a = 1;double b = 2;std::cout << type_name(a) << endl;return 0;
}
参考:
https://bbs.csdn.net/topics/392478020
https://blog.csdn.net/dulq_/article/details/80386295
c++ 把类型作为参数相关推荐
- php 函数返回值mixed,认识函数的类型、参数与返回值
函数的类型.参数与返回值 一.函数的基本语法语法 functionfunctionName(类型限定参数列表):返回值类型 { } 案例:计算两个数之和. functionsum(int$a,int$ ...
- C++非类型模板参数
对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数.在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定.但是在这里,我们面对的是这 ...
- C++知识点60——非类型模板参数
模板参数不仅可以使类型,也可以是值.可以用特定的类型名(比如int)而非typename或者class表示非类型模板参数.当模板被实例化时,非类型模板参数会被一个值而不是类型替代.非类型模板参数 一. ...
- java两个函数名字相同_为什么C不允许两个具有相同名称的函数/类模板,只有非类型模板参数(整数类型)的类型不同?...
我尝试这个时编译器会出错 . 我试过VC和g . 这同样适用于函数模板和类模板(但对于函数模板,只有在实例化函数模板时才会出现编译器错误;当编译器遇到第二个类定义时,会立即出现类模板的编译器错误) . ...
- 【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )
文章目录 I . 函数类型 II . 带参数名的参数列表 III . 可空函数类型 IV . 复杂函数类型解读 V . 函数类型别名 VI . 带 接收者类型 的函数类型 VII . 函数类型实例化 ...
- C++17 非类型模板参数的auto 和 DevC++ 支持C++17
模板参数分为两种,一种是类型模板参数,也是我们用得最多的一种: template <typename T, typename U> auto add(T t, U u) { ret ...
- 传递类型为参数的方法
传递类型为参数的方法 今天在写程序时发现要实现一个功能,就是需要一个树,然后当双击树的节点时弹出一个窗口. 这个看起来很简单,但是每个节点对应的窗口都不一样,如果窗口很多的话,需要写的代码就比较多. ...
- 理解 Delphi 的类(十) - 深入方法[4] - 共同类型的参数的简化写法
//要点4: 多个相同类型的参数可以简化写法 function MyFun(str: string; x,y,z: Integer): string; beginResult := str + Int ...
- C++ 泛型编程(二):非类型模板参数,模板特化,模板的分离编译
目录 非类型模板参数 函数模板的特化 类模板的特化 全特化 偏特化 部分参数特化 参数修饰特化 模板分离编译 问题分析 解决方法 非类型模板参数 模板的参数分为两种,一种是非类型参数,一种是类型参数. ...
- 非类型模板参数(参考《C++ Templates 英文版第二版》)
非类型模板参数(参考<C++ Templates 英文版第二版>) Chapter 3 3.1 非类型类模板参数 与前几章的简单例子不同,你也可以通过std::array实例化一个固定大小 ...
最新文章
- pandas dataframe 删除带空值的行 各种空值 (dropna()、isna()、isnull()、fillna())
- 近期热门领域新鲜数据集汇总!
- 斐波那契数列的3种求法及几种素数筛法
- mysql5.7 新建远程用户_Centos7中 mysql5.7 用户 创建 、授权、远程登录
- std::future ---C++17 多线程
- Android非常好用的组件或者框架
- Java进制间的转换
- 成功创业者培养的四个习惯
- web端前端自定义提示语信息
- 【正本清源】算力大战根本就从未开始过!BCH分叉事件之技术细节七问
- dbf解析_DBF文件格式分析.doc
- NLP-D23-cs224nkaggle房价预测复习chap5深度学习计算算法R2D7Unicorn
- linux 下进入root
- 针对开发者的云端真三维GIS开放平台 — DataEarth 平台介绍
- CSR867x开发基础教学 - 新建CSR8675默认的sink工程
- 探索 Zynq MPSoC:配套 PYNQ 和机器学习应用一起使用 - 序言鸣谢目录20211231
- 华为交换机用命令更改已有admin账户开启SSH
- 消息 ByteBuf 详解
- 读取应用程序/类库配置文件(比如***.dll.config)的方法小结
- 计算广告发展历程:从CPC到oCPX
热门文章
- A*寻路算法讲解+源码DEMO演示
- unix时间戳_unix时间戳在线工具
- 工业界推荐_Industrial RS(4)
- 线性判别分析(Linear Discriminant Analysis, LDA)算法分析
- 爬取腾讯视频网站数据
- 7-1 sdut-oop-7 答答租车系统(类的继承与多态 面向对象综合练习) (30 分)
- 程序员如何提高影响力 2.0
- 共享单车登录显示服务器未响应,ofo共享单车出故障了吗?ofo共享单车无法登陆、连接不上、无法结算怎么回事?[图]...
- 基于单片机的智能健康监护仪的设计(心电、心音、体温、脉搏、血压采集)
- 简书android微信抢红包,GO从0到1实战微服务版抢红包系统