实际上,标题是错误的,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++ 把类型作为参数相关推荐

  1. php 函数返回值mixed,认识函数的类型、参数与返回值

    函数的类型.参数与返回值 一.函数的基本语法语法 functionfunctionName(类型限定参数列表):返回值类型 { } 案例:计算两个数之和. functionsum(int$a,int$ ...

  2. C++非类型模板参数

    对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数.在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定.但是在这里,我们面对的是这 ...

  3. C++知识点60——非类型模板参数

    模板参数不仅可以使类型,也可以是值.可以用特定的类型名(比如int)而非typename或者class表示非类型模板参数.当模板被实例化时,非类型模板参数会被一个值而不是类型替代.非类型模板参数 一. ...

  4. java两个函数名字相同_为什么C不允许两个具有相同名称的函数/类模板,只有非类型模板参数(整数类型)的类型不同?...

    我尝试这个时编译器会出错 . 我试过VC和g . 这同样适用于函数模板和类模板(但对于函数模板,只有在实例化函数模板时才会出现编译器错误;当编译器遇到第二个类定义时,会立即出现类模板的编译器错误) . ...

  5. 【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )

    文章目录 I . 函数类型 II . 带参数名的参数列表 III . 可空函数类型 IV . 复杂函数类型解读 V . 函数类型别名 VI . 带 接收者类型 的函数类型 VII . 函数类型实例化 ...

  6. C++17 非类型模板参数的auto 和 DevC++ 支持C++17

    模板参数分为两种,一种是类型模板参数,也是我们用得最多的一种: template <typename T, typename U> auto add(T t, U u) {     ret ...

  7. 传递类型为参数的方法

    传递类型为参数的方法 今天在写程序时发现要实现一个功能,就是需要一个树,然后当双击树的节点时弹出一个窗口. 这个看起来很简单,但是每个节点对应的窗口都不一样,如果窗口很多的话,需要写的代码就比较多. ...

  8. 理解 Delphi 的类(十) - 深入方法[4] - 共同类型的参数的简化写法

    //要点4: 多个相同类型的参数可以简化写法 function MyFun(str: string; x,y,z: Integer): string; beginResult := str + Int ...

  9. C++ 泛型编程(二):非类型模板参数,模板特化,模板的分离编译

    目录 非类型模板参数 函数模板的特化 类模板的特化 全特化 偏特化 部分参数特化 参数修饰特化 模板分离编译 问题分析 解决方法 非类型模板参数 模板的参数分为两种,一种是非类型参数,一种是类型参数. ...

  10. 非类型模板参数(参考《C++ Templates 英文版第二版》)

    非类型模板参数(参考<C++ Templates 英文版第二版>) Chapter 3 3.1 非类型类模板参数 与前几章的简单例子不同,你也可以通过std::array实例化一个固定大小 ...

最新文章

  1. pandas dataframe 删除带空值的行 各种空值 (dropna()、isna()、isnull()、fillna())
  2. 近期热门领域新鲜数据集汇总!
  3. 斐波那契数列的3种求法及几种素数筛法
  4. mysql5.7 新建远程用户_Centos7中 mysql5.7 用户 创建 、授权、远程登录
  5. std::future ---C++17 多线程
  6. Android非常好用的组件或者框架
  7. Java进制间的转换
  8. 成功创业者培养的四个习惯
  9. web端前端自定义提示语信息
  10. 【正本清源】算力大战根本就从未开始过!BCH分叉事件之技术细节七问
  11. dbf解析_DBF文件格式分析.doc
  12. NLP-D23-cs224nkaggle房价预测复习chap5深度学习计算算法R2D7Unicorn
  13. linux 下进入root
  14. 针对开发者的云端真三维GIS开放平台 — DataEarth 平台介绍
  15. CSR867x开发基础教学 - 新建CSR8675默认的sink工程
  16. 探索 Zynq MPSoC:配套 PYNQ 和机器学习应用一起使用 - 序言鸣谢目录20211231
  17. 华为交换机用命令更改已有admin账户开启SSH
  18. 消息 ByteBuf 详解
  19. 读取应用程序/类库配置文件(比如***.dll.config)的方法小结
  20. 计算广告发展历程:从CPC到oCPX

热门文章

  1. A*寻路算法讲解+源码DEMO演示
  2. unix时间戳_unix时间戳在线工具
  3. 工业界推荐_Industrial RS(4)
  4. 线性判别分析(Linear Discriminant Analysis, LDA)算法分析
  5. 爬取腾讯视频网站数据
  6. 7-1 sdut-oop-7 答答租车系统(类的继承与多态 面向对象综合练习) (30 分)
  7. 程序员如何提高影响力 2.0
  8. 共享单车登录显示服务器未响应,ofo共享单车出故障了吗?ofo共享单车无法登陆、连接不上、无法结算怎么回事?[图]...
  9. 基于单片机的智能健康监护仪的设计(心电、心音、体温、脉搏、血压采集)
  10. 简书android微信抢红包,GO从0到1实战微服务版抢红包系统