Предположим, у меня есть следующее class A
, которое передается через различные вызовы функций и оболочки.
class A{
std::vector<int> a;
public:
int getSize const {return a.size();}
int getVal(int i) const {return a[i];}
// other private and public members and functions
}
Теперь по какой-то причине мне нужен тот же класс, но с двойным вектором. Я не могу шаблонизировать этот класс, потому что есть много сигнатур функций, которые я не могу изменить. Предлагается переименовать A
в A0
, шаблонизировать его, создать новые A
, содержащие A0<int>
и A0<double>
, следующим образом:
template <typename T>
class A0{
std::vector<T> a;
public:
int getSize const {return a.size();}
T getVal(int i) const {return a[i];}
// other private and public members and functions
}
class A{
// only one of the following will be initialized in the constructor and the other one will be null.
std::shared_ptr<A0<int>> iA;
std::shared_ptr<A0<double>> dA;
// also the following flag will be set in the constructor
bool isInt;
}
Это вопрос: если я хотите сделать минимальные изменения в разных местах кода, который ранее обращался, изменялся или просто передавал экземпляры класса A
, что должно быть сделано? Например, рассмотрим это в другой части старого кода:
A x;
int n = x.getSize();
Есть ли способ сохранить этот старый код без реализации метода getSize()
внутри нового класса A
, который будет содержать условный оператор и возвращает либо iA->getSize()
, либо dA->getSize()
на основе isInt
? Есть ли умный способ сделать это?
Есть ли другие предложения для достижения цели минимальных изменений в различных частях кода, которые используют (в основном обходят) старый A
?
}