我想循环使用一组相同类型的成员。这是一个有时有效的解决方案,有时不会:
#include <iostream>
#include <vector>
class Test{
public:
Test():xmin(0),ymin(0),xmax(0),ymax(0),acs((vector<int> (&)[4])xmin){};
vector<int> xmin,ymin,xmax,ymax;
vector<int> (&acs)[4];
};
int main(){
Test t;
t.xmin.push_back(2);
cout << t.xmin.size() << "=!=" <<t.acs[0].size() << endl;
}
以上测试代码适合我。在一个更大的程序中,我现在做的不是,即t.ymin似乎与t.acs [1]不一样,依此类推。 上述结构一般是有意义的还是我应该完全不同?
提前致谢, 托马斯
答案 0 :(得分:2)
您可以使用指向成员的指针数组。这种方式可能是最快的(对你来说似乎很重要),但有点模糊,你必须第二次提到你的成员变量列表。
#include <iostream>
#include <vector>
struct Test
{
std::vector<int> xmin,ymin,xmax,ymax;
std::vector<int>& GetByIndex(int index)
{
typedef std::vector<int> Test::*ptr_to_member; // typedef makes syntax less crazy
static const ptr_to_member pointers[4] = {
&Test::xmin, &Test::ymin, &Test::xmax, &Test::ymax
};
return this->*pointers[index];
}
};
int main(){
Test t;
t.xmin.push_back(2);
std::cout << t.xmin.size() << "=!=" << t.GetByIndex(0).size() << '\n';
}
如果您不需要速度,一个非常简单的解决方案涉及一个开关:
std::vector<int>& GetByIndex(int index)
{
switch (index) {
case 0: return xmin;
case 1: return ymin;
case 2: return xmax;
case 3: return ymax;
default: abort();
}
}
答案 1 :(得分:0)
Mike Seymour - 绝对正确 - 你的解决方案很危险。
尝试注入以下内容:
class Test
{
struct AllArrays
{
vector<int> * vec1, .... * vecN;
};
union
{
AllArrays _as_fields;
vector<int> * _as_Array[];
} _allTogether;
};
你需要编写一点点长限定符的有效负载:
Test t;
t._allTogether._as_fields.vec1
答案 2 :(得分:0)
这是非常糟糕的做法。特别是,您需要依赖padding详细信息。无法保证编译器将在没有任何填充的情况下布局数据成员。如果表示数组,则使用数组。我的2c ......