我有一个看起来像这样的课程
struct A {
double a1;
int b1;
double a2;
int b2;
};
我必须读取a1
,b1
,a2
和b2
的文件值。大多数情况下,所有四个数字都在文件中,但有时只有两个数字。
当有两个号码时,我想将值存储在a1
和b1
中,并且我想在a2
和b2
中存储“无”。如果a2
和b2
是指针,我可以将它们指定为nullptr
,但它们不是指针。
我可以在double
和int
变量中存储一些内容,以表明“没有”存储吗?
我知道Boost.Optional
可用,但我正在努力避免使用该库。
答案 0 :(得分:9)
您可以将NAN分配给double a2,这也表示int b2无效。
This page用于NAN使用。
答案 1 :(得分:4)
要么你有一个不合法的价值,要么你没有。如果您的值不合法(例如-1),请将其用作哨兵。如果没有,那么没有。使用Boost.Optional或滚动自己的“value plus boolean”类。
答案 2 :(得分:4)
你做不到。我可以想到两种替代方式:
答案 3 :(得分:2)
看起来你将会遇到更多问题。需要知道有多少值是有效的,将通过代码库进行说明。
我建议使用 factory 和基类。基本上,您将至少有两个类:
struct two_values
{
double a1;
int b1;
};
struct four_values : public two_values
{
double a2;
int b2;
};
当函数显式需要四个值时,请在声明中使用four_values
结构。否则在函数声明中使用two_values
结构。
此关系表明four_values
实例可用于任何需要two_values
结构的函数。
<强>替代强>
另一种方法是为您的商品使用std::vector
:
struct Container
{
std::vector<double> a_values;
std::vector<int> b_values;
};
这种设计的一个好处是,矢量可以告诉你有多少项目,并且概念是可扩展的,以防你需要6个项目。
答案 4 :(得分:1)
0
,-1
,std::numeric_limits<int>::max()
。处理数据时,只有在不等于非法值(或sentinel)时才使用该值。包含一个bool,表示有多少值:
struct A {
double a1;
int b1;
double a2;
int b2;
bool has_4_nums;
};
根据@Peter Pei Guo使用指针(int*
或std::unique_ptr<int>
),并在nullptr
不存在时指定。{/ p>
答案 5 :(得分:0)
您有两个选项可以避免boost::optional
因此依赖于Boost:
使用编译器std::experimental::optional
,该版本可从GCC 4.9+(以及最近版本IIRC中的Clang)和-std=c++14
获得。
使用AndrzejKrzemieński的“参考实施”从GitHub获取std::experimental::optional
。它只是标题,所以您只需将标题复制到项目中(当然要注意许可证)
答案 6 :(得分:0)
或者,您可以添加额外的成员以了解正常成员是否受到影响,例如:
struct A {
double a1;
int b1;
double a2;
int b2;
bool is_assigned[4];
};
或
struct A {
double a1;
int b1;
double a2;
int b2;
double* p_a1; // point to a1 when initialized, else nullptr
int* p_b1; // point to b1 when initialized, else nullptr
double* p_a2; // point to a2 when initialized, else nullptr
int* p_b1; // point to b2 when initialized, else nullptr
};
答案 7 :(得分:0)
struct A {
double a1;
int b1;
double a2;
int b2;
};
为此您可以使用任何类型的变量来指示是否为这些变量分配了两个或四个值。
喜欢将变量名称赋值= -1
因此,如果您的输入值为正,那么如果文件中有两个值,则只需输入
a2 = b2 = assigend
所以当你检查时,只需检查a2和b2的值是否为-1或其他,