我有一个包含x个整数的结构,要求每个最后一个都是非零的。这是我的结构:
struct thingy_t{
int a, b, c /* and so on */;
bool init();
};
随着时间的推移,我将在结构中添加许多其他成员,如果我忘记检查它是否为非零,这将成为一个问题。这就是为什么我想为每个成员自动化它。
在我的init
函数中,它尝试获取成员的值,如果其中任何一个为0,则返回false。
到目前为止,我有这个:
bool thingy_t::init(){
a = GetValue(/* blah blah */); // Will return 0 if it can't find anything
b = GetValue(/* other blah */);
/* and so on */
// Check if any value is zero
for(int* i = (int*)this
; i < (int*)((char*)this + sizeof(interfaces_t))
; i++){
if(!*i) return false;
}
return true;
}
我正在寻找一种更好的方法来实现这一目标,这种方法更具可读性和更安全的内存,因为我正在以一种他们可能无意的方式玩火(指针)。
另外,对于for
循环感到抱歉,我试图通过包装它使其更具可读性,但我可能使情况变得更糟。
答案 0 :(得分:0)
没有一种自然的方法来迭代结构并检查你所拥有的成员的某些值,所以在我看来,对你来说更好的选择应该是为你的任务做一个更好的设计或确保检查每次访问该结构时是否有不正确的值。
答案 1 :(得分:0)
我很简单地将类型实现为包含 struct thingy_t
{
int x[number];
bool all_non_zero() const;
};
bool thingy_t::all_non_zero() const
{
for (int i = 0; i < number; ++i)
if (!number[i]) return false;
return true;
}
或(可能更好)标准容器的数组。
如果在编译时指定了值的数量....
struct thingy_t
{
std::vector<int> x;
thingy_t(std::size_t size) : x(size) {};
bool all_non_zero() const;
};
bool thingy_t::all_non_zero() const
{
for (std::vector<int>::const_iterator it = x.begin(), end = x.end();
it != end number; ++it)
if (!(*it)) return false;
return true;
}
如果在编译时未指定编号,我将使用标准容器
bool thingy_t::all_non_zero() const
{
for (const auto &element : x)
if (!element) return false;
return true;
}
以上适用于所有版本的C ++,但可以在C ++ 11或更高版本中进行简化。
compile 'com.android.support:recyclerview-v7:23.1.1'
当然,您需要其他函数来实际存储数组或向量中的值。
如果整数的数量发生变化,代码将不会改变。您需要以某种方式单独跟踪每个元素的含义。
答案 2 :(得分:0)
我在享用美味的早餐时解决了自己的问题。
以下是我如何解决它:
struct thingy_t{
union{
struct{
int a, b, c;
}
int arr[3];
}
}
这样我可以通过访问变量。他们的名字以及他们在数组中的索引,所以我可以检查每个值是否非零容易(信息:James Root为数组灵感)