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

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. 一次DPM备份Exchange DAG的故障处理过程
  2. 倒计时两天丨NeurIPS 2020预讲会:7位智源青年科学家,21场报告
  3. 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立
  4. 信息系统项目管理师优秀论文:论信息系统范围管理
  5. vpn mysql_MYSQL数据库
  6. 解决iSlider的一些问题(滑动组件)
  7. 不懂网络和懂一点的区别
  8. [转载] python中pprint模块详解——print()和pprint()两者的区别
  9. Atitit oil painting article list sumup s55 C:\Users\Administrator\Desktop\油画技术资料包\Atitit Atitit 图像
  10. NSGA2算法中拥挤度计算代码
  11. Android PreferenceScreen
  12. 最新HyperSnap绿色汉化版
  13. 洛雪音乐助手(五音版)
  14. php实现给excel(xlsx)文件添加背景图水印
  15. 清卡时提示“增值税未申报或未比对”
  16. 重新编译Spark2.4.0 Parcels包
  17. Python django 社团管理系统
  18. 苹果电脑mp3转gif_Mac视频怎样转换成Gif图片?
  19. 白杨英语-字母含义笔记
  20. 哪来的gou zi 阿龙(最新更新于1.21日)

热门文章

  1. C语言入门篇(二)指针的介绍和运用
  2. 【第五周课后作业】“番茄工作法”软件创新性分析
  3. 【WPF】TextBox样式重写注意事项
  4. synchronized与lock,哪个效率更高
  5. 支持XML和JSON数据的图表控件FusionCharts XT
  6. Vue过滤器_使用过滤器进行数据格式化操作---vue工作笔记0015
  7. SAAS多租户实现方案_springboot 实现多租户_基于共享数据库_共享schema_共享数据表_基于baomidou_mybatis_plus---springcloud工作笔记158
  8. fckeditor异常总结---java.lang.ClassNotFoundException: org.devlib.schmidt.imageinfo.ImageInfo
  9. 计算机英语中motherboard,计算机英语--Motherboard.doc
  10. mysql utf-8_完美解决mysql下utf-8的乱码问题