是否可以从参数访问成员名称
Is it possible to access member name from parameter
请考虑这个类:
class A
{
public: //public in this example
string a1;
string a2;
string a3;
string a4;
int a5;
double a6;
(...) plus other 50 member names
multiset<string> getAttrib(const vector(A)& va, string attr)
{
for (vector<string>::const_iterator ci = va.begin; ci != va.end(); ++ci) {
cout << ci->attr << endl; //ERROR
}
};
成员函数可以像这样调用:
A a
a.getAttrib(vector_a, "a1");
这会导致错误。 Const class A has no member named 'attr'.
我不想写50个不同的case
语句来实现上述想要的灵活性。有可能吗?如果成员名称是私有的,是否存在公共成员函数来执行此操作?
除了class A
之外,我还有其他六个类似的类,并希望有一个父类,它将接受七个类中的任何一个的向量,并且可以返回所选成员名的值(或在实际情况下是多集)。
没有
一种直接的方法可以在C++中做你想做的事情,尽管有一些合理的反射框架尝试。 您还可以查看此处:如何向C++应用程序添加反射?有关反思的其他评论。 但是,我建议不要有 50 个成员变量,而只需使用一个私有std::hashmap
并使用std::string
密钥。 然后,您可以轻松地将字符串参数作为键传递,以便直接查找。
当然,这假设您的所有 50 个成员都属于同一类型,并且可能不适合您的应用程序。 但是,接受我的观点,即:做一点不同的事情。
您可以使用
X
宏技术将变量映射到包含您的a_n
的容器(例如std::deque
)的索引。您可能应该在末尾添加一个额外的条目,您可以使用它来获取所需的容器大小。
听起来你可能想要一个指向成员的指针,尽管最好更改为更灵活的对象表示形式,例如可区分联合数组 ( boost::variant
) 或 C++11 std::tuple
。
无论如何,使用指向成员的指针,您可以拥有
template< typename Attr_Type >
static vector< Attr_Type > getAttrib(const vector<A>& va, Attr_Type A:: *attr)
{
vector< Attr_Type > ret;
for (vector<A>::const_iterator ci = va.begin(); ci != va.end(); ++ci) {
cout << ci->*attr << endl;
ret.push_back( ci->*attr );
}
return ret;
}
用作
vector< A > vector_a;
vector< string > vector_a_a1 = A::getAttrib(vector_a, &A::a1);
相关文章:
- 这是关于成员访问规则的正确摘要吗
- 为什么我在空指针错误(链表)中获取成员访问权限
- 成员访问是否在空指针上定义C++?
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 为什么c++允许成员函数定义中实例的私有成员访问
- C/C++ 包含点的宏参数(成员访问运算符)
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 内部类私有成员访问和封闭的友好性
- 通过 C++ 中的另一个结构成员访问结构
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 常量表达式中的静态成员访问
- XVALUE来自类成员访问表达式
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 不明确的可变参数类成员访问
- C 受保护的成员访问
- 将typeID转换为静态成员访问(C )的命名空间