简体   繁体   English

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

[英]Check if variant has value at compile time

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.不能在 constexpr 语句中使用variant.index() ,因此需要迭代变体,如果它可以强制转换为某种类型,则返回true ;如果它是 emtpy 或包含零值,则返回false 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;
}

I think you want:我想你想要:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM