in_place_t
, in_place_type_t
in_place_index_t
Struktur
In C++17 eingeführt.
Die in_place_t
Typen und in_place_type_t
in_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 einerstd::optional
.in_place_type_t
gibt die direkte Konstruktion eines Objekts eines bestimmten Typs an. Es ist nützlich,std::any
dastd::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_view
oder 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.