Freigeben über


in_place_t, in_place_type_tin_place_index_t Struktur

In C++17 eingeführt.

Die in_place_tTypen und in_place_type_tin_place_index_t Tagtypen werden verwendet, um den überladenen Konstruktor auszuwählen, der das Objekt auf die gewünschte Weise erstellt. Für die Typen, die diese Tagtypen verwenden, können sie auch dazu beitragen, temporäre Kopier- oder Verschiebungsvorgänge zu vermeiden.

Syntax

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

Parameter

I
Der Index, in dem das Objekt erstellt wird.

T
Der Typ des zu erstellenden Objekts.

Hinweise

  • in_place_t gibt die direkte Konstruktion eines Objekts an. Dient zum Erstellen von Objekten innerhalb einer std::optional.
  • in_place_type_t gibt die direkte Konstruktion eines Objekts eines bestimmten Typs an. Es ist nützlich, std::any da std::any eine beliebige Art von Typ enthalten kann, daher müssen wir den darin enthaltenen Typ angeben.
  • in_place_index_t gibt die direkte Konstruktion eines Objekts an einem bestimmten Index an. std::variant Hier können Sie den Index angeben, in dem das Objekt erstellt wird.

Die folgenden Klassentypen verwenden diese Anweisungen in ihren Konstruktoren: , , optional, , single_viewoder any variant. expected

Beispiel

#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

Anforderungen

Header: <utility>

Namespace:std

Compileroption: /std:c++17 oder höher.