gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:33:39 26 4
gpt4 key购买 nike

我正在尝试根据 Data Mapper 设计模式编写一个小型 C++ Sql ORM。我正在玩模板和元编程以获得内省(introspection)功能。试了几次还是不行。。

在映射器中,我想使用 getter 方法从我要存储的对象中映射列名。
让我们看一个例子:

   class User
{
public :
int age() {
cout<<"int\n";
return 5;
}

float size(){
cout<<"float\n";
return 4.2;
}
};

我想要一个 Mapper 类,它使我可以使用方法绑定(bind)列:

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++ 模板的数据映射器设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com