- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在努力实现与字符串键关联的成员变量指针的映射。所有变量的范围都来自基类“BaseA”从映射中访问变量时,只需要使用基类方法(示例中的getDesc()),无需检索原始类型。
此代码在 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;
}
最佳答案
是的,有very few guarantees关于 reinterpret_cast
会做什么,从一个指向成员的指针转换为另一个不是其中之一(除非您随后转换回原始类型,这对您没有真正帮助)。
执行此操作的安全且简单的方法是使用 std::function
:
struct Vars
{
A1 a1;
A2 a2;
map< string, std::function<BaseA&(Vars&)> > vars;
Vars()
{
vars["A1_KEY"] = &Vars::a1;
vars["A2_KEY"] = &Vars::a2;
}
BaseA& get( const string& key )
{
auto it = vars.find( key );
if ( it != vars.end())
{
return it->second(*this);
}
throw std::out_of_range( "Invalid variable key:[" + key + "]");
}
};
请注意,如果您永远不需要更改 vars
字典,您可以将它变成一个 static const
成员。 (这意味着您需要在源文件中的类之外定义和初始化它。)
关于c++ - std::map 的多态成员变量指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46415283/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!