diff --git a/include/argparse.hpp b/include/argparse.hpp index fa10a06..b0c82ac 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -73,11 +73,6 @@ struct is_container< template static constexpr bool is_container_v = is_container::value; -template -struct is_string_like - : std::conjunction, - std::is_convertible> {}; - template constexpr bool standard_signed_integer = false; template <> constexpr bool standard_signed_integer = true; template <> constexpr bool standard_signed_integer = true; @@ -271,10 +266,10 @@ class Argument { -> std::ostream &; template - explicit Argument(std::string(&&a)[N], std::index_sequence) + explicit Argument(std::string_view(&&a)[N], std::index_sequence) : mIsOptional((is_optional(a[I]) || ...)), mIsRequired(false), mIsUsed(false) { - ((void)mNames.push_back(std::move(a[I])), ...); + ((void)mNames.emplace_back(a[I]), ...); std::sort( mNames.begin(), mNames.end(), [](const auto &lhs, const auto &rhs) { return lhs.size() == rhs.size() ? lhs < rhs : lhs.size() < rhs.size(); @@ -282,14 +277,9 @@ class Argument { } public: - Argument() = default; - - template ...>, int> = 0> - explicit Argument(Args &&... args) - : Argument({std::string(std::forward(args))...}, - std::make_index_sequence{}) {} + template + explicit Argument(std::string_view(&&a)[N]) + : Argument(std::move(a), std::make_index_sequence{}) {} Argument &help(std::string aHelp) { mHelp = std::move(aHelp); @@ -780,8 +770,9 @@ public: // Parameter packing // Call add_argument with variadic number of string arguments template Argument &add_argument(Targs... Fargs) { + using array_of_sv = std::string_view[sizeof...(Targs)]; auto tArgument = mOptionalArguments.emplace(cend(mOptionalArguments), - std::move(Fargs)...); + array_of_sv{Fargs...}); if (!tArgument->mIsOptional) mPositionalArguments.splice(cend(mPositionalArguments),