namespace std {
template <class T, class... Args>
any make_any(Args&& ...args); // (1)
template <class T, class U, class... Args>
any make_any(std::initializer_list<U> il,
Args&& ...args); // (2)
}
概要
any
オブジェクトを生成するヘルパ関数。
any
のコンストラクタ呼び出しでこの関数と等価のことを行う場合、先頭の引数としてstd::in_place_type
タグを付加する必要があり冗長である。この関数は、その冗長さを回避するためにある。
- (1) : 任意の型
T
のコンストラクタ引数args...
をとり、この関数内部でT
型オブジェクトを構築して保持するany
オブジェクトを構築する - (2) : 任意の型
T
のコンストラクタ引数il
とargs...
をとり、この関数内部でT
型オブジェクトを構築して保持するany
オブジェクトを構築する
効果
- (1) :
return any(in_place_type<T>, std::forward<Args>(args)...);
と等価 - (2) :
return any(in_place_type<T>, il, std::forward<Args>(args)...);
と等価
例
#include <any>
#include <string>
#include <vector>
#include <cassert>
int main()
{
// (1)
{
// std::string型のオブジェクトを、コンストラクタ引数として3と'z'を渡して構築する
std::any x = std::make_any<std::string>(3, 'z');
assert(std::any_cast<std::string>(x) == "zzz");
}
// (2)
{
std::allocator<int> alloc;
std::any x = std::make_any<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);
}
}
xxxxxxxxxx
#include <any>
#include <string>
#include <vector>
#include <cassert>
int main()
{
// (1)
{
// std::string型のオブジェクトを、コンストラクタ引数として3と'z'を渡して構築する
std::any x = std::make_any<std::string>(3, 'z');
assert(std::any_cast<std::string>(x) == "zzz");
}
// (2)
{
std::allocator<int> alloc;
std::any x = std::make_any<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
処理系
- Clang: 4.0.1 ✅
- GCC: 7.3 ✅
- Visual C++: ??