こんにちは、およげないプログラマーです。
今回は void ポインターの代替について書きたいと思います。
突然ですが、皆さんは void ポインターを使っていますか? 便利ですよね。void ポインタ。例を挙げればきりがないですが、データなら何でも保持できてしまいます。 ただ、気を付けたいのが型安全性などがなく、意図しない結果になりクラッシュしてしまう危険性がある点です。
そこで C++17から追加された std::any というものをご紹介します。(結構有名だとは思いますが。。) std::any とは動的に保持する型を切り替えられかつ、型安全性も保証されているクラスです。 それでは、実際に使用例(仮のコードです)を見ていきましょう。
int integer = 0; std::any any = integer; // 0が出力される std::cout << std::any_cast<int>(any) << "\n"; std::string str = "Any"; any = str; // Anyが表示される std::cout << std::any_cast<std::string>(any) << "\n";
このような感じで使用します。プログラムの途中で std::string型に切り替えています。 また、現在保持している型と異なる型を取り出そうすると std::bad_any_cast が投げられます。
int integer = 0;
std::any any = integer;
// int型が保持されているのに、std::string型でキャストしようとしている
try
{
std::any_cast<std::string>(any);
} catch (std::bad_any_cast& e)
{
// 例外が発生した際の処理...
}
以上がstd::any の簡単な紹介になります。 皆さんも std::any を void ポインタの代替として使用してみてはいかかでしょうか。(void ポインタも便利でよいですが、、)
それではまた次回の記事で!
-- 参考 -- https://cpprefjp.github.io/reference/any/any.html https://kenkyu-note.hatenablog.com/entry/2021/01/22/231454