#include #include void open_document_and_display_gui(std::string const& filename) {} bool done_editing() { return true; } enum command_type{ open_new_document }; struct user_command { command_type type; user_command(): type(open_new_document) {} }; user_command get_user_input() { return user_command(); } std::string get_filename_from_user() { return "foo.doc"; } void process_user_input(user_command const& cmd) {} void edit_document(std::string const& filename) { open_document_and_display_gui(filename); while(!done_editing()) { user_command cmd=get_user_input(); if(cmd.type==open_new_document) { std::string const new_name=get_filename_from_user(); std::thread t(edit_document,new_name); t.detach(); } else { process_user_input(cmd); } } } int main() { edit_document("bar.doc"); }