【问题标题】:Data Mapper design pattern using C++ template使用 C++ 模板的数据映射器设计模式
【发布时间】:2018-09-03 22:10:42
【问题描述】:

我正在尝试基于 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 工作吗? 我想我必须阅读有关模板元编程的文档...

【问题讨论】:

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


【解决方案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&lt;std::string, std::function&lt;void(Query&amp;, const std::string&amp;, C*)&gt;&gt; m_getters.

这样你删除你的getter函数的类型,仍然可以为Query::replace调用正确的重载

【讨论】:

  • 感谢您的回复。所以这个例子是针对吸气剂的。 setter 方法呢?
  • setter 的工作方式几乎相同。只是你会做类似(c-&gt;*f)(q.extract&lt;T&gt;(param)); 的事情来从查询中提取值,然后用它调用setter。可以通过扣减得到值的类型。参见例如 stackoverflow.com/questions/9065081/… 。顺便说一句,您还可以直接获取成员变量的地址,这样就无需为每种类型编写显式的 getter 和 setter。
猜你喜欢
  • 1970-01-01
  • 2017-04-22
  • 2010-09-17
  • 2010-09-28
  • 1970-01-01
  • 2011-05-17
  • 2012-01-14
  • 2013-02-11
  • 2013-04-10
相关资源
最近更新 更多