私は、メンバ変数のマップを文字列キーに関連付けて実装しています。 すべての変数はベースクラス "BaseA"からの範囲です マップから変数にアクセスする場合は、元のタイプを取得する必要がないように、ベースクラスのメソッド(サンプルではgetDesc()を使用する必要があります)。多相メンバ変数のポインタstd :: map
このコードはGNU g ++ 6.2.1でコンパイルして実行しますが、私が読んだことによると、reinterpret_castの使用は移植性がなく、他のコンパイラでは動作しない可能性があります。 これが正しいですか?あるいは、このコードはC++標準に準拠していますか? reinterpret_castを使用せずにこれを行う他の方法はありますか? "Vars"は、デフォルトのコピーコンストラクタとコピー割り当ての実装でコピー可能でなければならないという要件があります。
サンプルコード:
#include <iostream>
#include <sstream>
#include <map>
#include <typeinfo>
using namespace std;
struct BaseA
{
virtual string getDesc() = 0;
};
struct A1 : BaseA
{
string getDesc() override { return "This is A1"; }
};
struct A2 : BaseA
{
string getDesc() override { return "This is A2"; }
};
struct Vars
{
A1 a1;
A2 a2;
map< string, BaseA Vars::* > vars;
Vars()
{
vars["A1_KEY"] = reinterpret_cast<BaseA Vars::*>(&Vars::a1);
vars["A2_KEY"] = reinterpret_cast<BaseA Vars::*>(&Vars::a2);
}
BaseA& get(const string& key)
{
auto it = vars.find(key);
if (it != vars.end())
{
return this->*(it->second);
}
throw std::out_of_range("Invalid variable key:[" + key + "]");
}
};
int main()
{
Vars v;
cout << "a1 description :" << v.get("A1_KEY").getDesc() << endl;
cout << "a2 description :" << v.get("A2_KEY").getDesc() << endl;
return 0;
}
関連性のない種類ですが、 'std :: string'を' std :: map'のキーとして使用することをお勧めします。可能であれば(ほとんどの場合)、 'enum'を使用してください。 – DeiDei
ありがとうDeiDei。私は列挙型を使用することができますが、この場合、キーはコマンドラインとしてユーザーによって入力されるため、文字列がよりよく適合することを理解しています – SNJ