Шаблон проектирования Data Mapper с использованием шаблона C ++ - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь кодировать крошечный C ++ Sql ORM на основе шаблона проектирования Data Mapper. Я играю с шаблоном и метапрограммирование, чтобы получить функции самоанализа. Я не могу сделать это после нескольких попыток ..

Из картографа я хотел бы сопоставить имена столбцов с помощью метода get из объекта, в котором я хочу сохранить.
Давайте посмотрим на пример:

   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 голосов
/ 04 сентября 2018

Вы могли бы сделать что-то вроде

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.

Таким образом, вы стираете тип своей функции получения и все равно можете вызвать корректную перегрузку для Query::replace

...