diff --git a/include/etl/private/variant_variadic.h b/include/etl/private/variant_variadic.h index c4d5cfe9..5fb7d1ac 100644 --- a/include/etl/private/variant_variadic.h +++ b/include/etl/private/variant_variadic.h @@ -701,6 +701,29 @@ namespace etl return *static_cast(data); } +#if ETL_HAS_INITIALIZER_LIST + //*************************************************************************** + /// Emplace by type with variadic constructor parameters. + //*************************************************************************** + template + T& emplace(std::initializer_list il, TArgs&&... args) + { + static_assert(etl::is_one_of::value, "Unsupported type"); + + using type = etl::remove_cvref_t; + + operation(private_variant::Destroy, data, nullptr); + + construct_in_place_args(data, il, etl::forward(args)...); + + operation = operation_type::value, etl::is_move_constructible::value>::do_operation; + + type_id = etl::private_variant::parameter_pack::template index_of_type::value; + + return *static_cast(data); + } +#endif + //*************************************************************************** /// Emplace by index with variadic constructor parameters. //*************************************************************************** @@ -722,6 +745,29 @@ namespace etl return *static_cast(data); } +#if ETL_HAS_INITIALIZER_LIST + //*************************************************************************** + /// Emplace by index with variadic constructor parameters. + //*************************************************************************** + template + typename etl::variant_alternative>::type& emplace(std::initializer_list il, TArgs&&... args) + { + static_assert(Index < etl::private_variant::parameter_pack::size, "Index out of range"); + + using type = typename etl::private_variant::parameter_pack::template type_from_index::type; + + operation(private_variant::Destroy, data, nullptr); + + construct_in_place_args(data, il, etl::forward(args)...); + + operation = operation_type::value, etl::is_move_constructible::value>::do_operation; + + type_id = Index; + + return *static_cast(data); + } +#endif + //*************************************************************************** /// Move assignment operator for type. ///\param value The value to assign.