使用C++模板的数据映射器设计模式
Data Mapper design pattern using C++ template
我正在尝试根据数据映射器设计模式编写一个微小的C++ Sql ORM。 我正在使用模板和元编程来获得内省功能。几次尝试后我都做不到。.
从映射器中,我想使用我要存储的对象中的 getter 方法映射列名。
让我们看一个例子:
class User
{
public :
int age() {
cout<<"intn";
return 5;
}
float size(){
cout<<"floatn";
return 4.2;
}
};
我想要一个映射器类,它使我可以使用方法绑定列:
Mapper<User> mapper;
mapper.bind("age", &User::age);
mapper.bind("size", &User::size);
所以我可以像这样在我的数据库上写:
Mapper::insert(User * user)
{
//bindNames = {"size", "age"}
for (const auto& field : bindsNames)
{
// Generate
Query q("INSERT into users (name, age) VALUES(:name, :age)");
q.repace(":size", (user->*readSizeFct)();
q.repace(":age", (user->*readAgeFct)();
}
}
经过几次尝试,主要问题是我无法动态存储具有不同签名的函数指针列表......
你有什么建议让我的小ORM工作吗? 我想我必须阅读有关模板元编程的文档......
你可以做类似的事情
template<typename C, typename F>
void Mapper<C>::bind(const std::string& name, F f)
{
m_getters[name] = [f](Query& q, const std::string& param, C* c)
{
q.replace(param, (c->*f)());
};
}
与std::map<std::string, std::function<void(Query&, const std::string&, C*)>> m_getters
.
这样,您就可以擦除 getter 函数的类型,并且仍然可以调用正确的重载以进行Query::replace
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 资源管理设计模式
- 用于在回调中调用解析器的设计模式
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 在这种情况下我应该使用哪种设计模式
- C++中物体改变识别的设计模式?
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 设计模式,以避免不必要地添加抽象函数以适应新功能
- 工厂设计模式优化
- 使用C++模板的数据映射器设计模式
- 为什么以及如何使用原型设计模式
- 具有多个继承共享一个资源的对象 - 寻找良好的设计模式
- 在C++中创建观察器设计模式的好方法
- 现代C++在多大程度上消除了对设计模式的需求?
- 对于存储另一个类所需信息的类,例如其构造,是否有设计模式?
- 下面抽象工厂设计模式的实现是正确的吗
- sql记录集函数的状态设计模式
- 是否有可以处理方法调用依赖关系的设计模式?
- 使用 C++ 设计模式