A few nits:
(1) C++ has std::to_string nowadays. You don't need to roll your own.
(2) Environment::get would be more efficient if you used a hash table (e.g. unordered_map) instead of many ifs.
(3) It's better to pass std::string and std::vector by const reference, to avoid making a copy. Also take a look at std::string_view.
(4) const char[] is generally preferable to #define.