C++大统一数据结构:var.cpp(二)

256 阅读2分钟

接上篇,要造这个var类,首先要搞明白它是如何能够既装得下单个元素又能装下一个数组,现在呢,就解决这个问题。先实现单个int型和数组的关系,继而实现float和数组的关系,继而实现数组中嵌套数组。

首先,有这么一个东西:std::initializer_list,这个是C11的一个特性,骚气无比,能实现一种非常简易的数组初始化方法。到底怎么用,这样

std::vector v = { 1, 2, 3, 4 };

也就是说,一个类可以被赋予一个数组了,甚至可以这样:

json array_not_object = json::array({ {"currency", "USD"}, {"value", 42.99} });

这么着就比较简单了,首先定义一个数据结构类型枚举变量:_vt,用来表示这是一个什么样的数据类型。

我们来看看这个类是如何初始化的,首先,如果只是单一结构变量,如int或者float,就把相应的元素赋值和设定枚举类型就行,但如果它是一个数组类型的呢?

首先,它接收的是一个initializer_list类型 ,而且这个类型还只是一个模板,因此它接收的是initializer_list类型,所有数据变量又都转成了var型,然后如果var型里面还是一个initializer_list类型,那么就再进行下一次展开,这样的话,是不会出现错误的。

但是,如何读取呢?理论上讲,我想直接用[]来进行读取,并且通过重载,可以实现花样非常多的重载,但是现在,它如何读取?变量只有一个,不能存副本,因此只能存指针,新建一个指针数组,用它来指向各个元素,那么就可以迎刃而解了,非常棒。只是别忘了最后要删除它就行了。

如何添加一个元素呢?如果是一个元素的,添加一个,就变成了一个数组,也可以在数组任意位置进行插入

这里考考大家,如何new一个指针数组呢?

好了我放答案:

var **arr;

arr = new (var*)[]

因为*的优先级比较低,因此最好带上括号,从这里可以看出,C++真的不是什么好语言,太TM难懂了,如果不封装,怎么对新人友好?

好,接下来说说printf的问题,print是自动打印所有元素的,如果是数组,那么就添加上{},,我觉得海星。

简单的做了做,把功能实现了,下面贴一下实现结果:

int main(){
    var v1 = {1,2.0f,3};
    v1.print();
    return 0;
}

结果为:

{1,2,3,}

可见结果是正确的,有意思。。