Ағылшын тілінде оқу

Бөлісу құралы:


in_place_tin_place_index_t, in_place_type_t, структуру

Представлено в C++17.

in_place_tin_place_type_tТипы тегов и in_place_index_t тегов используются для выбора перегруженного конструктора, создающего объект на месте в нужном порядке. Для типов, использующих эти типы тегов, они также могут помочь избежать временных операций копирования или перемещения.

Синтаксис

C++
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{};

Параметры

I
Индекс, в котором создается объект.

T
Тип объекта для создания.

Замечания

  • in_place_t указывает на создание объекта на месте. Используется для создания объектов на месте внутри std::optional.
  • in_place_type_t указывает на создание объекта определенного типа на месте. Это полезно, std::any так как std::any может содержать любой тип, поэтому нам нужно указать тип, который он содержит.
  • in_place_index_t указывает на создание объекта на месте по определенному индексу. Используется для std::variant указания индекса, в котором создается объект.

Следующие типы классов используют эти структуры в своих конструкторах: expected, , any optionalsingle_viewили .variant

Пример

C++
#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

Требования

Заголовок: <utility>

Пространство имен: std

Параметр компилятора: /std:c++17 или более поздней версии.