in_place_t
, , in_place_type_t
in_place_index_t
estructura
Introducido en C++17.
Los in_place_t
tipos de etiqueta , in_place_type_t
y in_place_index_t
se usan para seleccionar el constructor sobrecargado que crea el objeto en su lugar de la manera deseada. Para los tipos que usan estos tipos de etiqueta, también pueden ayudar a evitar operaciones temporales de copia o movimiento.
Sintaxis
struct in_place_t
{
explicit in_place_t() = default;
};
inline constexpr in_place_t in_place{};
template <class T>
struct in_place_type_t
{
explicit in_place_type_t() = default;
};
template <class T>
constexpr in_place_type_t<T> in_place_type{};
template <size_t I>
struct in_place_index_t
{
explicit in_place_index_t() = default;
};
template <size_t I>
constexpr in_place_index_t<I> in_place_index{};
Parámetros
I
Índice donde se crea el objeto en su lugar.
T
Tipo del objeto que se va a crear.
Comentarios
in_place_t
indica la construcción local de un objeto . Se usa para crear objetos en su lugar dentro de .std::optional
in_place_type_t
indica la construcción local de un objeto de un tipo específico. Resulta útilstd::any
porquestd::any
puede contener cualquier tipo de tipo, por lo que es necesario especificar el tipo que contiene.in_place_index_t
indica la construcción local de un objeto en un índice específico. Use constd::variant
para especificar el índice donde se crea el objeto.
Los siguientes tipos de clase usan estas estructuras en sus constructores: expected
, optional
, single_view
any
o variant
.
Ejemplo
#include <iostream>
#include <optional>
#include <any>
#include <variant>
// compile with /std:c++17
struct MyStruct
{
double value;
MyStruct(double v0, double v1 = 0) : value(v0 + v1) {}
};
int main()
{
// Construct a MyStruct directly inside opt
std::optional<MyStruct> opt(std::in_place, 29.0, 13.0);
// Construct a MyStruct object inside an any object
std::any a(std::in_place_type<MyStruct>, 3.14);
// Construct a MyStruct object inside a vector at index 0
std::variant<MyStruct, int> v(std::in_place_index<0>, 2.718);
if (opt)
{
std::cout << opt->value << ", ";
}
std::cout << std::any_cast<MyStruct>(a).value << ", "
<< std::get<0>(v).value;
return 0;
}
42, 3.14, 2.718
Requisitos
Encabezado: <utility>
Espacio de nombres: std
Opción del compilador: /std:c++17
o posterior.