Собственно использую https://github.com/mpark/variant в C++14, single header версию.
Очень неудобно, что фактически все методы - глобальные:
mpark::get_if<State1>(&m_state)
// vs
m_state.get_if<State1>()
Вопрос в том, как добавить в эту либу get_if (и holds_alternative) как методы класса? Только для типов. Взятие по индексу не нужно.
Там внутри такой адок, что я боюсь вообще что-либо трогать. Типа:
template <
typename Arg,
typename Decayed = lib::decay_t<Arg>,
lib::enable_if_t<!std::is_same<Decayed, variant>::value, int> = 0,
lib::enable_if_t<!detail::is_in_place_index<Decayed>::value, int> = 0,
lib::enable_if_t<!detail::is_in_place_type<Decayed>::value, int> = 0,
std::size_t I = detail::best_match<Arg, Ts...>::value,
typename T = lib::type_pack_element_t<I, Ts...>,
lib::enable_if_t<std::is_constructible<T, Arg>::value, int> = 0>
inline constexpr variant(Arg &&arg) noexcept(
std::is_nothrow_constructible<T, Arg>::value)
: impl_(in_place_index_t<I>{}, lib::forward<Arg>(arg)) {}
Или проще тупо враппер сделать? Но там тоже тонну шаблонов придётся писать - не осилю.