以前は元ネタの意図がよくわからなかったのですが、今回は頑張って挑戦してみたいと思います。
おそらくは単なる配列の中身を、実行時にレイアウトして構造体のように使おうということではないかと考えました。それであれば元ネタのマクロで何とかなると思います。ただし、C++の場合はレイアウトを変更する際には、既存のオブジェクトの解体と新しく追加するオブジェクトの構築を正しく行わなければなりません。
もう少し使い勝手をよくするのであれば、次のようなクラスを作ってしまうのも悪くないかもしれません。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class structure { public: template <typename T> void set(std::string const& key, T const& value) { this->members_[key] = value; } template <typename T> T const& get(std::string const& key) const { return std::any_cast<T const&>(this->members_.at(key)); } private: std::map<std::string, std::any> members_; }; |
アクセッサであるgetとsetを使えば、自由にメンバーを設定・取得することができます。アドレスが必要なら、getで参照を取得したあと、&演算子なりstd::addressofなりを使えば取得できます。