最終更新日時(UTC):
が更新

履歴 編集

function template
<any>

std::any::emplace(C++17)

template <class T, class... Args>
decay_t<T>& emplace(Args&&... args); // (1)

template <class T, class U, class... Args>
decay_t<T>& emplace(std::initializer_list<U> il,
                    Args&&... args); // (2)

概要

要素型のコンストラクタ引数から直接構築する。

  • (1) : 任意の型Tのコンストラクタ引数args...をとり、この関数内部でT型オブジェクトを構築して代入する
  • (2) : 任意の型Tのコンストラクタ引数ilargs...をとり、この関数内部でT型オブジェクトを構築して代入する

テンプレートパラメータ制約

効果

  • (1) : reset()を呼び出す。その後std::forward<Args>(value)...をコンストラクタ引数として、型std::decay_t<T>のオブジェクトを直接構築して保持する
  • (2) : reset()を呼び出す。その後ilstd::forward<Args>(value)...をコンストラクタ引数として、型std::decay_t<T>のオブジェクトを直接構築して保持する

戻り値

  • 構築されたオブジェクトへの参照を返す

事後条件

  • (1), (2) : *thisは値を保持した状態となる

例外

  • (1), (2) : 型std::decay_t<T>の選択されたコンストラクタが、任意の例外を送出する可能性がある

#include <any>
#include <string>
#include <vector>
#include <cassert>

int main()
{
  // (1)
  {
    std::any x;

    // std::string型のオブジェクトを、コンストラクタ引数として3と'z'を渡して構築する
    x.emplace<std::string>(3, 'z');
    assert(std::any_cast<std::string>(x) == "zzz");
  }

  // (2)
  {
    std::allocator<int> alloc;
    std::any x;
    x.emplace<std::vector<int>>({3, 1, 4}, alloc);

    const auto& vec = std::any_cast<const std::vector<int>&>(x);
    assert(vec[0] == 3);
    assert(vec[1] == 1);
    assert(vec[2] == 4);
  }
}

出力

バージョン

言語

  • C++17

処理系