Concept-Based Polymorphism
От: a7d3  
Дата: 16.07.20 20:09
Оценка: :)))
Долго спорили за виды полиморфизма в ООП применимо к С++ (в 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
Стиль расстановки {} авторский, лениво было переформатировать.
llvm polymorphism oop
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.