Skip to content

Commit 1f69433

Browse files
committed
Try this ugly solution for non default constructible
1 parent 06a9ad3 commit 1f69433

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

include/aws/crt/Variant.h

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,23 @@ namespace Aws
119119
} // namespace VariantDebug
120120
#endif /* defined(AWS_CRT_ENABLE_VARIANT_DEBUG) */
121121

122+
template <bool> class DefaultConstructibleVariant;
123+
124+
template <> class DefaultConstructibleVariant<true>
125+
{
126+
public:
127+
explicit DefaultConstructibleVariant(int) {}
128+
DefaultConstructibleVariant() = default;
129+
};
130+
template <> class DefaultConstructibleVariant<false>
131+
{
132+
public:
133+
explicit DefaultConstructibleVariant(int) {}
134+
DefaultConstructibleVariant() = delete;
135+
};
136+
122137
/* Depending on the Variant types, this struct either deletes special move members or defaults them. */
123-
template <bool = true> class MovableVariant;
138+
template <bool> class MovableVariant;
124139

125140
template <> class MovableVariant<true>
126141
{
@@ -142,7 +157,7 @@ namespace Aws
142157
};
143158

144159
/* Depending on the Variant types, this struct either deletes special copy members or defaults them. */
145-
template <bool = true> class CopyableVariant;
160+
template <bool> class CopyableVariant;
146161

147162
template <> class CopyableVariant<true>
148163
{
@@ -178,18 +193,17 @@ namespace Aws
178193
VariantDetail::Checker::HasType<typename std::decay<OtherT>::type, Ts...>::value,
179194
int>::type;
180195

196+
public:
181197
using FirstAlternative = typename ThisVariantAlternative<0>::type;
182198

183199
static constexpr bool isFirstAlternativeNothrowDefaultConstructible =
184200
std::is_nothrow_default_constructible<FirstAlternative>::value;
185201

186-
public:
187202
using IndexT = VariantDetail::Index::VariantIndex;
188203
static constexpr std::size_t AlternativeCount = sizeof...(Ts);
189204

190205
VariantImpl() noexcept(isFirstAlternativeNothrowDefaultConstructible)
191206
{
192-
using FirstAlternative = typename ThisVariantAlternative<0>::type;
193207
new (m_storage) FirstAlternative();
194208
m_index = 0;
195209
}
@@ -658,7 +672,9 @@ namespace Aws
658672
* @tparam Ts Types of the variant value.
659673
*/
660674
template <typename... Ts>
661-
class Variant : public VariantDetail::MovableVariant<Conjunction<std::is_move_constructible<Ts>...>::value>,
675+
class Variant : public VariantDetail::DefaultConstructibleVariant<
676+
VariantDetail::VariantImpl<Ts...>::isFirstAlternativeNothrowDefaultConstructible>,
677+
public VariantDetail::MovableVariant<Conjunction<std::is_move_constructible<Ts>...>::value>,
662678
public VariantDetail::CopyableVariant<Conjunction<std::is_copy_constructible<Ts>...>::value>
663679
{
664680
/* Copyability and Movability depend only on constructors (copy and move correspondingly) of the
@@ -674,24 +690,33 @@ namespace Aws
674690
using EnableIfOtherIsThisVariantAlternative = typename std::
675691
enable_if<VariantDetail::Checker::HasType<typename std::decay<OtherT>::type, Ts...>::value, int>::type;
676692

693+
static constexpr bool isFirstAlternativeNothrowDefaultConstructible =
694+
VariantDetail::VariantImpl<Ts...>::isFirstAlternativeNothrowDefaultConstructible;
695+
677696
public:
678697
using IndexT = VariantDetail::Index::VariantIndex;
679698
static constexpr std::size_t AlternativeCount = sizeof...(Ts);
680699

681700
Variant() = default;
682701

683-
template <typename T, EnableIfOtherIsThisVariantAlternative<T> = 1> Variant(const T &val) : m_variant(val)
702+
template <typename T, EnableIfOtherIsThisVariantAlternative<T> = 1>
703+
Variant(const T &val)
704+
: VariantDetail::DefaultConstructibleVariant<isFirstAlternativeNothrowDefaultConstructible>(1),
705+
m_variant(val)
684706
{
685707
}
686708

687709
template <typename T, EnableIfOtherIsThisVariantAlternative<T> = 1>
688-
Variant(T &&val) : m_variant(std::forward<T>(val))
710+
Variant(T &&val)
711+
: VariantDetail::DefaultConstructibleVariant<isFirstAlternativeNothrowDefaultConstructible>(1),
712+
m_variant(std::forward<T>(val))
689713
{
690714
}
691715

692716
template <typename T, typename... Args>
693717
explicit Variant(Aws::Crt::InPlaceTypeT<T> ipt, Args &&...args)
694-
: m_variant(ipt, std::forward<Args>(args)...)
718+
: VariantDetail::DefaultConstructibleVariant<isFirstAlternativeNothrowDefaultConstructible>(1),
719+
m_variant(ipt, std::forward<Args>(args)...)
695720
{
696721
}
697722

0 commit comments

Comments
 (0)