C++1zでは、コピー可能かムーブ可能であればどんな型でも代入できるany
クラスが入ります。C++には全ての型の継承元のobject
クラスというものはないので、その代わりにこのクラスを使えます。
このクラスのために、<any>
ヘッダが新規追加されます。
#include <iostream> #include <any> #include <string> int main() { std::any a = 3; // int値を代入 a = std::string("hello"); // stringオブジェクトを代入 // 中身を取り出す // 取り出せなかったらstd::bad_any_cast例外 try { std::string s = std::any_cast<std::string>(a); std::cout << s << std::endl; } catch (std::bad_any_cast& e) { std::cout << "bad_any_cast" << std::endl; } // 中身を取り出す // こちらは取り出せなかったらヌルポインタが返る if (std::string* s = std::any_cast<std::string>(&a)) { std::cout << *s << std::endl; } else { std::cout << "null" << std::endl; } }
出力:
hello hello
Boostと標準の差異
標準に採択されたany
は、Boostにあるany
とほぼ同じです。Boost 1.61.0時点のany
との差異は、constexpr
対応していることに加え、optional
とvariant
と共通の設計にするために、標準側に以下の機能があるくらいです:
この共通設計のために、Boostにある以下のメンバ関数はありません:
参照
- N1939 Any Library Proposal for TR2
- N3390 Any Library Proposal (Revision 1)
- N3508 Any Library Proposal (Revision 2)
- N3804 Any Library Proposal (Revision 3)
- N4529 Working Draft, C++ Extensions for Library Fundamentals, Version 2
- N4562 Working Draft, C++ Extensions for Library Fundamentals, Version 2
- P0220R0 Adopt Library Fundamentals TS for C++17
- P0220R1 Adopt Library Fundamentals V1 TS Components for C++17 (R1)
- P0032R0 Homogeneous interface for
variant
,any
andoptional
- P0032R1 Homogeneous interface for
variant
,any
andoptional
(Revision 1) - P0032R2 Homogeneous interface for
variant
,any
andoptional
(Revision 2) - P0032R3 Homogeneous interface for
variant
,any
andoptional
(Revision 3)
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。