Этот код устанавливает порт на NotSet
, поэтому деталь с if constexpr
не работает должным образом. Как это можно исправить?
Это проблема, если ссылки: когда вы проверяете наличие std::string
в has_type
, std::string
присутствует, но со ссылкой (&&
, заданнойstd::move()
, если я не ошибаюсь).
Решение: удалить ссылки
template <typename T, typename... Us>
struct has_type<T, std::tuple<Us...>>
: std::disjunction<std::is_same<T, std::remove_reference_t<Us>>...> {};
// ..................................^^^^^^^^^^^^^^^^^^^^^^^^^^^
- РЕДАКТИРОВАТЬ -
Как указаноJarod42 (спасибо!), таким образом, имя has_type
больше не является правильным.
А может быть, вам нужен has_type
, который обнаруживает наличие проверки типа и ссылок ...
Может быть, лучше сохранить оригинальный has_type
и использовать std::remove_reference_t
, вызывая его
// ............................................VVVVVVVVVVVVVVVVVVVVVVV
if constexpr (has_type<std::string, std::tuple<std::remove_reference_t<UnorderedArgs>...>>::value)
return std::get<std::string &&>(std::move(arg_set));
else
return "NotSet";