使用C++模板的数据映射器设计模式

Data Mapper design pattern using C++ template

本文关键字:映射 设计模式 数据 C++ 使用      更新时间:2023-10-16

我正在尝试根据数据映射器设计模式编写一个微小的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