Skip to content

Commit d2d3885

Browse files
drewdzzzalyapunov
authored andcommitted
Trait: extend trait is_variant
The trait is populated with getter by index and emplace method. We will need an ability to get an alternative by index to iterate over all alternatives and detect all accepted families in decoder. Emplace is needed to write a value to variant - now the trait does not offer such an option.
1 parent 7b54ec8 commit d2d3885

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

src/Utils/Traits.hpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,9 @@ struct is_variant_h<T, std::void_t<
543543
decltype(std::declval<T>().index()),
544544
decltype(std::variant_size<T>::value),
545545
typename std::variant_alternative<0, T>::type,
546-
decltype(tnt::get<std::variant_alternative_t<0, T>>(std::declval<T>()))>>
546+
decltype(tnt::get<0>(std::declval<T>())),
547+
decltype(tnt::get<std::variant_alternative_t<0, T>>(std::declval<T>())),
548+
decltype(std::declval<T>().template emplace<0>(tnt::get<0>(std::declval<T>())))>>
547549
: std::is_same<size_t, std::decay_t<decltype(std::declval<T>().index())>> {};
548550
} //namespace details {
549551

test/TraitsUnitTest.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,21 @@ struct CustomVariant {
643643
size_t index() const { return m_index; }
644644
template <class T> T& get() { return std::get<T&>(std::tie(i, d)); }
645645
template <class T> const T& get() const { return std::get<const T&>(std::tie(i, d)); }
646+
template <size_t I> auto& get() { return std::get<I>(std::tie(i, d)); }
647+
template <size_t I> const auto& get() const { return std::get<I>(std::tie(i, d)); }
648+
template <size_t I, class ...Args> void emplace(Args&&... args)
649+
{
650+
m_index = I;
651+
auto &v = std::get<I>(std::tie(i, d));
652+
using value_t = std::remove_cv_t<std::remove_reference_t<decltype(v)>>;
653+
static_assert(std::is_constructible_v<value_t, Args...>);
654+
emplace_impl(v, std::forward<Args>(args)...);
655+
}
656+
private:
657+
template <class T, class ...Args> void emplace_impl(T &v, Args&&... args)
658+
{
659+
v = T(std::forward<Args>(args)...);
660+
}
646661
};
647662

648663
namespace std

0 commit comments

Comments
 (0)