Compartir a través de


in_place_t, , in_place_type_tin_place_index_t estructura

Introducido en C++17.

Los in_place_ttipos de etiqueta , in_place_type_ty 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 útil std::any porque std::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 con std::variant para especificar el índice donde se crea el objeto.

Los siguientes tipos de clase usan estas estructuras en sus constructores: expected, optional, single_viewany 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.