名前空間
変種
操作

std::any::emplace

From cppreference.com
< cpp‎ | utility‎ | any
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
 
 
template< class ValueType, class... Args >
std::decay_t<ValueType>& emplace( Args&&... args );
(1) (C++17以降)
template< class ValueType, class U, class... Args >
std::decay_t<ValueType>& emplace( std::initializer_list<U> il, Args&&... args );
(2) (C++17以降)

格納されているオブジェクトを、引数から構築される std::decay_t<ValueType> 型のオブジェクトに変更します。

まず、現在格納されているオブジェクト (存在する場合) を reset() によって破棄し、次に

1) std::decay_t<ValueType> 型のオブジェクトを、直接初期化 (リスト初期化ではない)std::forward<Args>(args)... から構築し、それを格納オブジェクトとします。
2) std::decay_t<ValueType> 型のオブジェクトを、直接初期化 (リスト初期化ではない)il, std::forward<Args>(args)... から構築し、それを格納オブジェクトとします。

目次

[編集] テンプレートパラメータ

ValueType - 格納される値の型
型要件
-
std::decay_t<ValueType>CopyConstructibleの要件を満たす必要があります。

[編集] 戻り値

新しく格納されたオブジェクトへの参照。

[編集] 例外

T のコンストラクタが投げる例外を投げます。例外が投げられた場合、以前に格納されていたオブジェクト (存在する場合) は破棄されており、*this は値を保持しません。

[編集]

#include <algorithm>
#include <any>
#include <iostream>
#include <string>
#include <vector>
 
class Star
{
    std::string name;
    int id;
 
public:
    Star(std::string name, int id) : name{name}, id{id}
    {
        std::cout << "Star::Star(string, int)\n";
    }
 
    void print() const
    {
        std::cout << "Star{\"" << name << "\" : " << id << "};\n";
    }
};
 
int main()
{
    std::any celestial;
    // (1) emplace(Args&&... args);
    celestial.emplace<Star>("Procyon", 2943);
    const auto* star = std::any_cast<Star>(&celestial);
    star->print();
 
    std::any av;
    // (2) emplace(std::initializer_list<U> il, Args&&... args);
    av.emplace<std::vector<char>>({'C', '+', '+', '1', '7'} /* no args */);
    std::cout << av.type().name() << '\n';
    const auto* va = std::any_cast<std::vector<char>>(&av);
    std::for_each(va->cbegin(), va->cend(), [](char const& c) { std::cout << c; });
    std::cout << '\n';
}

実行結果の例

Star::Star(string, int)
Star{"Procyon" : 2943};
St6vectorIcSaIcEE
C++17

[編集] 関連項目

any オブジェクトを構築する
(公開メンバ関数) [編集]
内包オブジェクトを破棄する
(公開メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)