使用C ++模板的Data Mapper设计模式

时间:2018-09-03 22:10:42

标签: c++ templates orm metaprogramming function-pointers

我正在尝试基于Data Mapper设计模式编写一个小型C ++ Sql ORM。 我正在使用模板和元编程来获得自省功能。经过几次尝试我还是做不到。

我想从映射器中使用要存储在.object中的对象的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正常工作? 我想我必须阅读有关模板元编程的文档...

1 个答案:

答案 0 :(得分:1)

您可以做类似的事情

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调用正确的重载