Общий указатель на неизменяемый тип имеет семантику значения
Я пытаюсь создать класс построителя, который имеет семантику значений, которая выглядит примерно так
class Pipeline {
public:
Pipeline(
const std::string& name,
std::optional<size_t> limitIn,
std::optional<size_t> limitOut) {...}
shared_ptr<const Pipeline> limitInput(size limit) const {
return make_shared<Pipeline>(name_, size_, limit, limitOut_) ;
}
shared_ptr<const Pipeline> limitOutput(size limit) const {
return make_shared<Pipeline>(name_, size_, limitInput_, limit) ;
}
private:
const string name_;
const size_t limitInput_;
const size_t limitOutput_;
};
Поскольку переменные-члены являются константами, shared_ptr по сути неизменяема.
Однако этот шаблон не работает, когда мне нужно добавить наследование. Например:
class Pipeline {
...
virtual void doSomething() const = 0;
}
Теперь в любом из методов (скажем, в limitOutput), когда мне нужно создать новый экземпляр Pipeline, мне также нужно будет знать о производном классе, поскольку я не могу создать экземпляр трубопровода больше. Я могу придумать один способ решить эту проблему - добавить еще один виртуальный метод для инициализации объекта.
class Pipeline {
...
virtual shared_ptr<Pipeline> create(const std::string& name,
std::optional<size_t> limitIn,
std::optional<size_t> limitOut) const = 0;
}
class SpecialPipeline : public Pipeline {
...
virtual shared_ptr<Pipeline> create(const std::string& name,
std::optional<size_t> limitIn,
std::optional<size_t> limitOut) const override {
return make_shared<SpecialPipeline>(name, limitIn, limitOut);
}
};
Теперь все методы будут просто подчиняться этому
shared_ptr<const Pipeline> limitInput(size limit) const {
return create(name_, size_, limit, limitOut_);
}
Пока это работает, я лично считаю, что это не изящно, предполагает дублирование и не ощущается идиоматикой c. Как можно go об этом реализовать? Будем признательны за любые отзывы.