【发布时间】:2016-07-25 19:19:21
【问题描述】:
我试过联合...
struct foo
{
union
{
struct // 2 bytes
{
char var0_1;
};
struct // 5 bytes
{
char var1_1;
int var1_2;
};
};
};
问题:联合做我想做的事,除了它们总是会占用最大数据类型的大小。在我的情况下,我需要 struct foo 进行一些初始化,以便我告诉它从两者中选择哪个结构(如果这甚至是合法的),如下所示。
所以在那之后,我尝试了类模板重载...
template <bool B>
class foo { }
template <>
class foo<true>
{
char var1;
}
template <>
class foo<false>
{
char var0;
int var1;
}
问题:我对模板非常满意,而且我可以在 char 和 int 上使用相同的变量名,但问题在于语法。因为类是在编译时创建的,所以模板布尔变量需要是硬编码的常量,但在我的情况下,布尔变量需要在运行时由用户定义。
所以我需要两个“世界”中的一些东西。我怎样才能实现我想要做的事情?
!!注意:foo 类/结构稍后将被继承,因此如前所述,foo 的大小至关重要。
编辑#1:: 应用:
基本上,这将用于读取/写入(使用指针作为接口)特定的数据缓冲区,还允许我创建(类/结构的新实例)相同的数据缓冲区。您在上面看到的变量指定了长度。如果是较小的数据缓冲区,则长度以 char/byte 形式写入。如果它是一个更大的数据缓冲区,则第一个 char/byte 为 null 作为标志,而 int 指定长度。在长度之后,很明显实际数据随之而来,因此为什么要继承。班级规模是最重要的。我也需要吃蛋糕。
【问题讨论】:
-
你想要完成什么?
-
也许你可以看看 boost::any?
-
@NathanOliver 我将使用它作为读取/写入数据的指针,并初始化它的一个实例以写入新数据。 foo 将更像是一个共享界面。
-
最好的办法是使用宏的
__x86_64__等,或者通过UINTPTR_MAX检查它的大小是 64 位长大小,还是 32 位长大小。然后使用size_t作为您的会员类型。那应该保证它是指针的大小。可能有点开箱即用,或者您尝试做的事情的思考方向错误。