【问题标题】:Check if variant has value at compile time检查变体在编译时是否具有价值
【发布时间】:2021-04-08 16:01:26
【问题描述】:

不能在 constexpr 语句中使用 variant.index(),因此需要迭代变体并返回 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;
}

【问题讨论】:

  • 空,你的意思是 std::monostate 或 T == std::variant&lt;&gt; (格式不正确)? std::visitconstexpr 顺便说一句。
  • 我有一些可变参数,即用户设置,例如 variant。我有这个 Targs... 单独但不想在每次使用变体类型时都使用它们。所以我想在没有 Ts 的情况下解析这个变体......立即从变体类型本身给出这个序列。似乎结合variant_length和索引序列是可能的。
  • 我还有一些变量类型相同,我在声明中初始化这个变量零值,也许我可以简单地在 std::get 方法中用文字 0 检查初始值,但我不确定这是检查复杂变体值的正确方法。

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


【解决方案1】:

我想你想要:

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

【讨论】:

  • 没错!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多