昨天在github上看到一个非常震惊的项目,c_language_template,用C语言实现C++那样的模板。
这个让我看到了一种非常神奇的写法,用define来实现C++的模板,对于每一个实例都在一个块内具体化,然后通过块内最后一行返回对象,通过它就可以调用块内实现的具体函数。
这个也让我学到了一种在C语言实现C++的类的方法。这种写法大概就是,在将公共函数和公共变量塞在一个结构体里面,私有变量和函数的实现全部塞在一个块内,块的最后一行返回那个塞满公共函数的结构体,将这个块用define包装一下,就变成了构造函数(宏)。
这样写的好处:
- 函数可以少写一个参数,可以像C++那样使用成员函数。
- 用了模板之后可以省略大量的类型转换。
- 限定了函数和变量的作用域。
这样写的坏处:
- 每个这样创建一个对象,都会实例化出很多个一样的函数,感觉上会很占用栈的空间。
- 编译器会弹出大量的警告,好像是什么蹦床函数。
- 由于作用域的问题,不能嵌套使用。
总之,我觉得这样写很有意思,而且只要减少成员函数的大小,应该就没有问题了。所以我的想法是结合两种写法,我的Node依然用void * 类型的实现,函数也都是用以前的void * ,然后实例化的成员函数则是调用这些函数,同时对返回值进行类型转换,这样包装一下就可以像写C++一样写C语言了。
后续
之前用模板重写了一下链表之后,发现好像没有想象中的好用,那个作用域太麻烦了,但是又发现了新的东西。只要实现了链表的创建、根据索引查找节点、在指定节点后面插入节点、删除指定节点,这4个函数,其他的函数都可以通过宏来实现。同理,实现了链表之后,可以只靠宏来实现栈和队列。