Can't use variant.index()
in constexpr statements so need to iterate variant and return true
if it can cast to some type or false
if it's emtpy or contains zero value. Try this code, but seems index sequence is not variadic type and ... operator not available in this case.
template <typename T>
bool has_value(T value) noexcept {
if constexpr (std::is_convertible_v <T, bool>) {
return value;
}
else if constexpr (is_variant_v<T>) {
constexpr size_t N = std::variant_size_v<decltype(value)>;
using variant_sequence = typename std::make_index_sequence<0, N-1>::type;
bool __has_value = (( std::get<variant_sequence>(value), true) || variant_sequence... ) ;
return __has_value;
}
return false;
}