由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 两个C++的类有类似的函数,有没有可能统一来使用?
进入Programming版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
一个就是ifstream::read, ofstream::write,
而我们有一个类Block,它的读写很类似,不是char*,而是unsigned char*这样的。
这里有两个问题,第一,如果这两个类都继承一个接口IOable,到好办了,一个基类的
指针可以指向ifstream或者Block,然后read。可惜这两个类没有关系。
第二,类型有些不同。
我现在为每个类都写了一个库,一个从文件读入,一个从Block读入。有什么好办法可
以把库统一成一个吗?
w*********l
发帖数: 1337
2
用template写。
如果是c++20的话还可以限定concept,有点儿像Rust的trait.

【在 b***i 的大作中提到】
: 一个就是ifstream::read, ofstream::write,
: 而我们有一个类Block,它的读写很类似,不是char*,而是unsigned char*这样的。
: 这里有两个问题,第一,如果这两个类都继承一个接口IOable,到好办了,一个基类的
: 指针可以指向ifstream或者Block,然后read。可惜这两个类没有关系。
: 第二,类型有些不同。
: 我现在为每个类都写了一个库,一个从文件读入,一个从Block读入。有什么好办法可
: 以把库统一成一个吗?

a******n
发帖数: 100
3
可以写 wrapper class (制造 Writer class hierarchy, DataMedium class
hierarchy),然后自己做 dispatch 。
Check Lisp's multi-methods.
Someone implemented for C++ here:
https://github.com/jll63/yomm2
简单的说,就是现在的主流语言C++/Java/Python等等,都在偷懒,只在一个object上
做single dispatch: (所谓的 virtual function):
Animal.makeNoise() {/*abstract*/}
Cat.makeNoise() {print("miao");}
Cow.makeNoise() {print("moo");}
Sheep.makeNoise() {print("mie");}
那么,如果两个动物打架该怎么办?
fight(Animal a, Animal b) {/*abstract*/}
fight(Cat a, Cow b) {a.usePaw(); b.useMuzzle();}
fight(Cat a, Sheep b) {a.usePaw(); b.useHorn();}
fight(Cow a, Sheep b) {a.useMuzzle(); b.useHorn();}
在C++/Java 里有所谓的 visitor design pattern, 来解决这个需要 double
dispatch 在(Animal a 和 Animal b)的问题。
如果动物园有很多种动物,任意3种(甚至N种)一起打架,又怎么办?
所以 Lisp 的 multi-methods 是更 generalized 的解决方案:就是给任意数目的
argument list (而且每一个argument都有自己单独的inheritance hierarchy) 建
multiple dispatch table.
有兴趣的话,可以网上找些资料研究下
w***g
发帖数: 5958
4
你这个需求叫做序列化。看眼cereal这个库。
b***i
发帖数: 3043
5
好办法

【在 w*********l 的大作中提到】
: 用template写。
: 如果是c++20的话还可以限定concept,有点儿像Rust的trait.

1 (共1页)
进入Programming版参与讨论