Долго спорили за виды полиморфизма в ООП применимо к С++ (в
RAII и исключения в конструкторе)
А вот пример
https://habr.com/ru/company/samsung/blog/505850/
того, что давно используется без претензий на отдельную парадигму, выходящую за пределы ООП.
| TL;DR — код от туда |
| template <typename IR, typename... ArgTs> class PassManager {
public:
void run(IR& ir, ArgTs... args) {
for (auto& Pass : Passes) {
Pass->run(ir, args...);
}
}
template <typename PassT>
void addPass(PassT Pass) {
Passes.emplace_back(new detail::PassModel<IR, PassT, ArgTs...>(std::move(Pass)));
}
private:
std::vector<std::unique_ptr<detail::PassConcept<IR, ArgTs...>>> Passes;
};
namespace detail {
template <typename IR, typename... ArgTs> class PassConcept {
public:
virtual ~PassConcept() = default;
virtual void run(IR& ir, ArgTs... args) = 0;
};
template <typename IR, typename PassT, typename... ArgTs> class PassModel final : public PassConcept<IR, ArgTs...> {
public:
explicit PassModel(PassT Pass) : pass_(std::move(pass)) {}
void run(IR& ir, ArgTs... args) final {
pass_.run(ir, args...);
}
private:
PassT pass_;
};
} // end namespace detail
|
| |
Стиль расстановки {} авторский, лениво было переформатировать.