#include <string.h>
#include <iostream>
#include <list>
#include <memory>
class polygon {
public:
polygon() = default;
virtual ~polygon() = default;
virtual double area() const = 0;
};
class triangle : public polygon {
public:
virtual double area() const override {
std::cerr << "triangle." << std::endl;
return 0;
}
};
class polygon_plugin {
public:
void add_plugin(const char *name) {
if (0 == strcasecmp(name, "triangle")) {
plugin_list.push_front(std::unique_ptr<polygon>(new triangle));
}
}
void run_plugin() {
for (auto &plugin : plugin_list) {
plugin->area();
}
}
private:
std::list<std::unique_ptr<polygon>>plugin_list;
};
int main() {
polygon_plugin pp;
pp.add_plugin("triangle");
pp.run_plugin();
return 0;
}