我正在尝试基于Data Mapper设计模式编写一个小型C ++ Sql ORM。我正在玩模板和元编程以获得内省功能。几次尝试后我无法做到。
从映射器,我想用我想要存储的对象的getter方法映射列名。 让我们看一个例子:
class User
{
public :
int age() {
cout<<"int\n";
return 5;
}
float size(){
cout<<"float\n";
return 4.2;
}
};
我想要一个Mapper类,它可以使用方法绑定列:
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
调用正确的重载