in_place_t
、 in_place_type_t
、 in_place_index_t
構造体
C++17 で導入されました。
in_place_t
、in_place_type_t
、およびin_place_index_t
タグの種類を使用して、目的の方法でオブジェクトを作成するオーバーロードされたコンストラクターを選択します。 これらのタグ型を使用する型の場合、一時的なコピー操作や移動操作を回避するのにも役立ちます。
構文
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
、 optional
、 single_view
、 any
、または variant
。
例
#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
以降。