문자열 키와 연관된 멤버 변수 포인터의 맵을 구현하려고합니다. 모든 변수의 범위는 기본 클래스 "BaseA" 맵에서 변수에 액세스 할 때는 원래 클래스 유형 (getDesc()가 샘플에서만 사용됨) 만 있으면 원래 유형을 검색 할 필요가 없습니다.다형 멤버 변수 포인터의 std :: map
이 코드는 GNU g ++ 6.2.1에서 컴파일되고 실행되지만, 내가 읽은 바에 따르면 reinterpret_cast는 이식성이 없으므로 다른 컴파일러에서 작동하지 않을 수 있습니다. 이것이 맞습니까? 아니면이 코드가 C++ 표준을 준수합니까? reinterpret_cast를 사용하지 않고이 작업을 수행 할 수있는 다른 방법이 있습니까? "Vars"는 기본 copy-contructor 및 copy-assignment 구현으로 복사 할 수 있어야합니다.
샘플 코드 :
#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