共用方式為


in_place_tin_place_type_tin_place_index_t 結構

C++17 引進。

in_place_tin_place_type_tin_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 來指定建立物件的索引。

下列類別類型會在其建構函式中使用這些結構:expectedoptionalsingle_viewanyvariant

範例

#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或更新版本。