#include <iostream>
#include <map>
#include <string>
using namespace std;
enum class DataType {
NULL_TYPE = 0,
INT_TYPE = 1,
DOUBLE_TYPE = 2,
STRING_TYPE = 3,
};
struct Column {
DataType type;
void *data;
};
Column empty_column{.type = DataType::NULL_TYPE, .data = nullptr};
class AbsColumnProcessor {
private:
virtual void before_precess(Column &column) {}
virtual void after_process(Column &column) {}
virtual void do_process(Column &column) = 0;
public:
virtual void process(Column &column) {
before_precess(column);
do_process(column);
after_process(column);
}
};
using int_func_cb = void (*)(int &);
class IntColumnProcessor : public AbsColumnProcessor {
private:
int_func_cb func;
void do_process(Column &column) override {
func(*(int *) (column.data));
}
public:
IntColumnProcessor(int_func_cb func) : func(func) {}
};
class DataFrame {
map<string, Column> name2column;
public:
void set(string key, Column &column) {
name2column[key] = column;
}
Column &get(string key) {
if (!name2column.contains(key)) {
return empty_column;
}
return name2column[key];
}
};
void addOne(int &x) {
x++;
}
int main() {
// 初始化
DataFrame df;
int *x = new int(1);
Column column{.type = DataType::INT_TYPE, .data = x};
// 设置
df.set("1", column);
// 获得
auto &v = df.get("1");
// 修改
AbsColumnProcessor *ap;
switch (v.type) {
case DataType::NULL_TYPE : {
break;
}
case DataType::INT_TYPE : {
ap = new IntColumnProcessor(addOne);
ap->process(v);
cout << *x << endl;
}
}
}
c++ 类型处理初步代码
最新推荐文章于 2022-05-20 15:21:04 发布