#ifndef DYNINST_DYNCOMPAT_LEXICAL_CAST_HPP #define DYNINST_DYNCOMPAT_LEXICAL_CAST_HPP #include #include #include #include namespace dyncompat { class bad_lexical_cast : public std::bad_cast { public: const char* what() const noexcept override { return "bad lexical cast"; } }; template Target lexical_cast(const Source& source) { if constexpr(std::is_same_v) { std::ostringstream os; os << source; if(!os) { throw bad_lexical_cast(); } return os.str(); } else { std::istringstream is(lexical_cast(source)); Target target{}; is >> target; if(!is || !is.eof()) { throw bad_lexical_cast(); } return target; } } } // namespace dyncompat #endif