std :: holds_alternative可变参数模板

时间:2019-07-30 07:59:55

标签: c++ c++17

是否可以将std::holds_alternative包装到可变参数模板以用于更多类型?

例如:

std::variant<bool, int, double, std::string> var = 4;
bool r = std::holds_alternative<bool, double>(var); // holds either bool or double

2 个答案:

答案 0 :(得分:8)

是的,它可以通过简单的折叠表达式来实现。

template<typename... Alts, typename... Ts>
constexpr bool holds_any_of(std::variant<Ts...> const& v) noexcept {
    return (std::holds_alternative<Alts>(v) || ...);
}

答案 1 :(得分:5)

不,这不可能。但是您可以自己滚动:

template <class ...Request, class ...Types>
constexpr bool holdsAlternative(const std::variant<Types...>& v) noexcept
{
   return (std::holds_alternative<Request>(v) || ...);
}

在尝试使用std::holds_alternative时被调用:

bool r = holdsAlternative<bool, double>(var);