кароч поясняю для тупых (не (!) как будто что-то плохое):
вместо последующего `std::map<std::string, DbgFuncProto>` и `cmdmap[cmdname](out_stream, argv)` я бы делал:
`typedef DbgFunc std::function<void (std::ofstream&)>`, затем `std::map<std::string, DbgFunc>` и, наконец, `cmdmap[cmdname](out_stream)` // а добавлять с `std::bind` либо лямбдой
@mugiseyebrows function ещё в TR1 был, это уже весьма и весьма зрелая штука
и поддвачиваю про стринглитайпд аргсы // хоть кто-то понял почти на всю глубину