in_place_t
, in_place_type_t
, in_place_index_t
struktura
Představeno v jazyce C++17.
Typy in_place_t
značek a , in_place_type_t
in_place_index_t
jsou použity k výběru přetížené konstruktor, který vytvoří objekt na místě požadovaným způsobem. U typů, které tyto typy značek používají, mohou také pomoct vyhnout se dočasným operacím kopírování nebo přesouvání.
Syntaxe
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{};
Parametry
I
Index, ve kterém je objekt vytvořen na místě.
T
Typ objektu, který chcete vytvořit.
Poznámky
in_place_t
označuje místní konstrukci objektu. Slouží k vytváření objektů na místě uvnitř objektustd::optional
.in_place_type_t
označuje místní konstrukci objektu určitého typu. Je to užitečné,std::any
protožestd::any
může obsahovat libovolný typ, takže potřebujeme zadat typ, který obsahuje.in_place_index_t
označuje místní konstrukci objektu v určitém indexu.std::variant
Slouží k určení indexu, ve kterém je objekt vytvořen.
Následující typy tříd používají tyto struktury v jejich konstruktory: expected
, optional
, single_view
, any
nebo variant
.
Příklad
#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
Požadavky
Záhlaví: <utility>
Obor názvů: std
Možnost kompilátoru: /std:c++17
nebo novější.