#include #include #include #include #include using namespace std; enum class OutputFormat { Markdown, Html }; struct ListStrategy { virtual ~ListStrategy() = default; virtual void add_list_item(ostringstream& oss, const string& item) = 0; virtual void start(ostringstream& oss) = 0; virtual void end(ostringstream& oss) = 0; }; struct MarkdownListStrategy : ListStrategy { void start(ostringstream& oss) override { } void end(ostringstream& oss) override { } void add_list_item(ostringstream& oss, const string& item) override { oss << " * " << item << endl; } }; struct HtmlListStrategy : ListStrategy { void start(ostringstream& oss) override { oss << "
    " << endl; } void end(ostringstream& oss) override { oss << "
" << endl; } void add_list_item(ostringstream& oss, const string& item) override { oss << "
  • " << item << "
  • " << endl; } }; template struct TextProcessor { void clear() { oss.str(""); oss.clear(); } void append_list(const vector items) { list_strategy.start(oss); for (auto& item : items) list_strategy.add_list_item(oss, item); list_strategy.end(oss); } string str() const { return oss.str(); } private: ostringstream oss; LS list_strategy; }; int main() { // markdown TextProcessor tpm; tpm.append_list({"foo", "bar", "baz"}); cout << tpm.str() << endl; // html TextProcessor tph; tph.append_list({"foo", "bar", "baz"}); cout << tph.str() << endl; getchar(); return 0; }