【发布时间】: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<>(格式不正确)?std::visit是constexpr顺便说一句。 -
我有一些可变参数,即用户设置,例如 variant
。我有这个 Targs... 单独但不想在每次使用变体类型时都使用它们。所以我想在没有 Ts 的情况下解析这个变体......立即从变体类型本身给出这个序列。似乎结合variant_length和索引序列是可能的。 -
我还有一些变量类型相同,我在声明中初始化这个变量零值,也许我可以简单地在 std::get 方法中用文字 0 检查初始值,但我不确定这是检查复杂变体值的正确方法。
标签: c++ c++17 variadic-templates std-variant