#pragma once #include #include #include namespace program { inline std::string join(std::string const & tok, std::vector const & data) { std::string accum = data.empty() ? "" : data.front(); for (size_t i = 1; i < data.size(); ++i) { accum += tok; accum += data[i]; } return accum; } template struct conversion_helper; template T convert(D const & data) { return conversion_helper{}(data); } template struct conversion_helper< T, std::enable_if_t>> { T operator()(std::string const & str) const { return T(str); } T operator()(std::vector const & data) const { return operator()(data.front()); } }; template <> struct conversion_helper { int operator()(std::string const & str) const { return std::stoi(str); } int operator()(std::vector const & data) const { return operator()(data.front()); } }; template struct conversion_helper> : conversion_helper { std::vector operator()(std::vector const & data) const { std::vector rval; for (auto & str : data) { rval.emplace_back((*this)(str)); } return rval; } }; }