0

不能variant.index()在 constexpr 语句中使用,因此需要迭代变体并返回true,如果它可以转换为某种类型,或者false它是 emtpy 或包含零值。试试这个代码,但似乎索引序列不是可变参数类型并且 ... 运算符在这种情况下不可用。

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;
}
4

1 回答 1

2

我想你想要:

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>) {
        return std::visit([](const auto& elem){ return has_value(elem); }, value);
    }
    return false;
}
于 2021-04-08T16:20:43.713 回答