模板化结构中的零大小成员变量

Tim*_*mmm 9 c++ templates

我有一个模板化的结构,它有一个带有额外浮点数的变体,如下所示:

template <bool HasFloat>
struct Foo {
   std::vector<int> a;
   float b; // Not needed if HasFloat is false
};
Run Code Online (Sandbox Code Playgroud)

为了节省内存(是的,它很重要)我想省略浮点数,如果HasFloat是假的.由于struct最好的方式还有很多其他东西会是这样的:

using B = typename std::conditional<HasFloat, float, ZeroSizedType>::type;
B b;
Run Code Online (Sandbox Code Playgroud)

除非我能告诉你C++中没有零大小的类型.唯一的例外似乎是"灵活阵列成员",所以我可以这样做:

using B = typename std::conditional<HasFloat, float, float[]>::type;
Run Code Online (Sandbox Code Playgroud)

除了它们仅在C99中支持,而不是C++.

对此的标准解决方案似乎是使用继承,因为基类可以是零大小的,但是我的结构也可以通过程序集访问,并且为了使程序集更简单,如果float b;它位于结构的末尾而不是开始,无论如何,这是不保证的.

所以这似乎是将模板专业化作为唯一的选择,但我的课实际上相当长,我想避免重复一切.我还缺少另一种解决方案吗?

LeD*_*YoM -2

您可以创建一个专门用于是否具有浮动的结构,然后在转发模板参数的结构中使用它。像这样的东西:

template <bool HasFloat>
struct PerhapsFloat;

template <>
struct PerhapsFloat<true>
{
    float b;
};

template <>
struct PerhapsFloat<false>
{

};

template <bool HasFloat>
struct Foo {
   std::vector<int> a;
   PerhapsFloat<HasFloat> b;
};
Run Code Online (Sandbox Code Playgroud)

在这里,您有一个演示: https ://godbolt.org/z/7zPto9

  • 这仍然会使用至少 1 个字节,OP 很清楚这一点。这对问题没有任何帮助。 (2认同)