在编译时检查变体是否具有值

时间:2021-04-08 16:01:26

标签: c++ c++17 variadic-templates std-variant

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

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

1 个答案:

答案 0 :(得分: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;
}