您不能使用类数组,但可以使用指向函数的指针数组.

typedef std::unique_ptr (*Creator)();

template

std::unique_ptr make() { return new T{}; }

Creator const array[] = { make, make, make };

int main() {

std::unique_ptr b = array[1]();

b->foo();

}

对于那些担心创建这么多模板函数的成本的人来说,这是一个例子:

#include

struct Base { virtual void foo() const = 0; };

struct A: Base { void foo() const { printf("A"); } };

struct B: Base { void foo() const { printf("B"); } };

struct C: Base { void foo() const { printf("C"); } };

typedef Base* (*Creator)();

template

static Base* make() { return new T{}; }

static Creator const array[] = { make, make, make };

Base* select_array(int i) {

return array[i]();

}

Base* select_switch(int i) {

switch(i) {

case 0: return make();

case 1: return make();

case 2: return make();

default: return 0;

}

}

LLVM / Clang生成以下输出:

define %struct.Base* @select_array(int)(i32 %i) uwtable {

%1 = sext i32 %i to i64

%2 = getelementptr inbounds [3 x %struct.Base* ()*]* @array, i64 0, i64 %1

%3 = load %struct.Base* ()** %2, align 8, !tbaa !0

%4 = tail call %struct.Base* %3()

ret %struct.Base* %4

}

define noalias %struct.Base* @select_switch(int)(i32 %i) uwtable {

switch i32 %i, label %13 [

i32 0, label %1

i32 1, label %5

i32 2, label %9

]

; :1 ; preds = %0

%2 = tail call noalias i8* @operator new(unsigned long)(i64 8)

%3 = bitcast i8* %2 to i32 (...)***

store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @vtable for A, i64 0, i64 2) to i32 (...)**), i32 (...)*** %3, align 8

%4 = bitcast i8* %2 to %struct.Base*

br label %13

; :5 ; preds = %0

%6 = tail call noalias i8* @operator new(unsigned long)(i64 8)

%7 = bitcast i8* %6 to i32 (...)***

store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @vtable for B, i64 0, i64 2) to i32 (...)**), i32 (...)*** %7, align 8

%8 = bitcast i8* %6 to %struct.Base*

br label %13

; :9 ; preds = %0

%10 = tail call noalias i8* @operator new(unsigned long)(i64 8)

%11 = bitcast i8* %10 to i32 (...)***

store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @vtable for C, i64 0, i64 2) to i32 (...)**), i32 (...)*** %11, align 8

%12 = bitcast i8* %10 to %struct.Base*

br label %13

; :13 ; preds = %9, %5, %1, %0

%.0 = phi %struct.Base* [ %12, %9 ], [ %8, %5 ], [ %4, %1 ], [ null, %0 ]

ret %struct.Base* %.0

}

不幸的是,它不够智能,无法使用常规数组代码自动内联函数(LLVM优化器的已知问题,我不知道gcc是否做得更好)……但是使用switch确实是可能的.

怎么创建c语言数组的格式,c – 如何创建类类型数组?相关推荐

  1. three.js使用外部模型创建动画,使用GLTF格式文件动画创建动画(vue中使用three.js71)

    使用GLTF格式文件动画创建动画 1.demo效果 2. 实现要点 2.1 加载GLTF文件 2.2 创建AnimationMixer动画 2.3 render中更新动画 3. demo代码 1.de ...

  2. visual 创建c语言程序吗,visual studio怎么创建c语言

    visual studio创建c语言程序的方法:首先打开VS主程序,选择创建新项目:然后在菜单栏中选择C++:接着进入VS主界面,在右边的解决方案管理器中找到源文件,右键添加,并选择新建项:最后选择添 ...

  3. java 类类型数组

    今天做题,遇到了定义数组类型是类的,以前都是基本数据类型啊,今天看到这个懵了好久,不过最终还是搞懂了.最后做了一个练习题,一起来看一下吧 题目要求是: // 一个方阵,3排,第一排,从左往右依次是 小 ...

  4. 数据结构与算法:动态数组(利用万能指针实现任意类型数组操作)

    原理介绍 我们利用万能指针来实现动态数组,数组元素类型可以是任意类型,因为我们只维护用户提供的数据的地址,所以可以用万能指针来接受,这样就实现了类似C++中的模板功能了. 先说说动态数组和静态数组.静 ...

  5. Java 数组定义格式-数组动态初始化-数组元素的访问-数组静态初始化-数组的遍历-数组获取最大值

    数组定义格式: 1.数组概述 在一个班级中,有非常多学生需要存储每位学生的考试成绩. 比如 a=98; b=97; c=96; d=88; -- 1)数组概述:一次性声明大量的用于存储数据的变量; 这 ...

  6. Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制)

    原文:Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制) 异常机制和File类 异常机制 基本概念 异常就是"不正常"的含义,在 Java 语言中主要指 ...

  7. javascript 类型数组读取二进制数据

    先建一个文件,按UTF-16大端 BOM 格式保存一个字符串:hi aleck, 使用 file API 把他按二进制方式读取到浏览器. 文件读取方法在这里: http://hi.baidu.com/ ...

  8. C语言第二课:项目的创建、基本结构与两个常见问题的处理

    目录 一.创建新项目: 二.C语言程序基本结构: 1.头文件(#include<...>): 2.主函数(int main(){...}): 3.程序语句(语句项): 三.常见问题处理: ...

  9. php 1 2 3 转arry_在PHP语言中使用JSON和将json还原成数组的方法

    在之前我写过php返回json数据简单实例,刚刚上网,突然发现一篇文章,也是介绍json的,还挺详细,值得参考.内容如下 从5.2版本开始,PHP原生提供json_encode()和json_deco ...

最新文章

  1. linux启动关闭脚本,Linux下自动启动关闭Oracle脚本
  2. python爬虫,爬取猫眼电影2(xpath和bs4)
  3. Servlet和HTTP请求协议-学习笔记02【Servlet_体系结构与urlpartten配置、HTTP请求协议】
  4. 10tb服务器硬盘 选购,2017最靠谱大容量机械硬盘选购指南(基于Backblaze硬盘寿命可靠性报告)...
  5. 南京理工大学计算机学院教授严捍,2019年7月1日学术报告二则(宋巍 教授,南京理工大学;张鹏程 副教授,河海大学)...
  6. 中国吉非替尼行业市场供需与战略研究报告
  7. CCF201812-1 小明上学(100分)【序列处理】
  8. Java logging整理
  9. MindManager思维导图 PRDBRD写作方法与技巧 产品规划模板下载
  10. Linux网络编程:libnet 移植及使用
  11. 如何购买阿里云域名教程(域名购买+配置)~
  12. 采购精英的行为准则(精典)
  13. win7没有语音识别怎么办|win7系统语音识别设置方法
  14. SpringCloud-狂神(1. 概述)学习笔记
  15. size与capacity的区别
  16. 关于 Kubernetes中kube-controller-managerr的一些笔记
  17. SpringCloud Alibaba 实战之《配置中心:基于 Nacos 集中管理应用配置》
  18. 个税局端服务器处理结果查询不到三方协议,「实用」电子税务局中三方协议验证失败如何处理?来看攻略啦!...
  19. CS_2023_01
  20. vps系统服务器,vps系统和云服务器

热门文章

  1. 南海区行政审批管理系统接口规范v0.3(规划) 2.业务申报API 2.1.businessApply【业务申报】...
  2. python第六篇:Python复制超大文件、复制二进制文件
  3. C语言-07其它相关
  4. 代码动态改变 NGUI UILabel 的字体
  5. 如何在类的外部修改类中的私有数据成员
  6. C++_类和对象_C++多态_多态的原理剖析---C++语言工作笔记070
  7. axios_json-server的介绍与服务器搭建---axios工作笔记002
  8. 大数据之-hadoop知识体系架构---大数据之hadoop工作笔记0001
  9. 分表扩展全局序列原理_高可用_单表存储千万级_海量存储_分表扩展---MyCat分布式数据库集群架构工作笔记0025
  10. Netty工作笔记0080---编解码器和处理器链梳理