Можно ли использовать конструкторы с разными параметрами в унаследованных классах? - PullRequest
0 голосов
/ 11 марта 2020

Есть ли способ переопределить функцию, возвращающую шаблонную сущность с разными конструкторами в C ++?

template<T> class A {
  virtual shared_ptr<T> createEntity (a)
     return make_shared<T>(a);
}

class E
{
  int a,b;
  E (int x, int y) : a(x), b(y);
}

class B : public A<E> {
  int b;
  shared_ptr<E> createEntity (a) override 
     return make_shared<E>(a,b);
}

Стандартный конструктор большинства сущностей будет требовать только одну переменную, тогда как сущности других классов требуют более одна переменная, которая будет построена. Можно ли этого достичь без условной компиляции?

Редактировать: Другие сущности реализуют свой конструктор только с одной переменной "a", поэтому я в основном хочу использовать A :: createEntity (a) в большинстве случаев и хочу использовать B :: createEntitiy в особых случаях.

1 Ответ

0 голосов
/ 11 марта 2020

Этого довольно легко достичь (и даже без условной компиляции).

Все, что вам нужно сделать, - это придумать какую-то структуру параметров и свернуть все ваши аргументы в это.

Что-то вроде:

struct InitInfo {
  int x_;
  int y_;//may not always be used..
};

Затем используйте его с E:

class E
{
  int a,b;
  public:
  E (InitInfo info) : a(info.x_), b(info.y_) {
  }
};

И используйте так:

return make_shared<E>(InitInfo{a,b});
...