当前位置: 首页 > 知识库问答 >
问题:

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

朱高超
2023-03-14
template <bool HasFloat>
struct Foo {
   std::vector<int> a;
   float b; // Not needed if HasFloat is false
};

为了节省内存(是的,它很重要),如果hasfloat为false,我想省略浮动。由于struct中还有很多其他内容,因此最好的方法如下所示:

using B = typename std::conditional<HasFloat, float, ZeroSizedType>::type;
B b;

不过,据我所知,在C++中没有零大小的类型。唯一的例外似乎是“灵活数组成员”,所以我也许可以做一些类似的事情:

using B = typename std::conditional<HasFloat, float, float[]>::type;

只不过它们只在C99中得到支持,而不是在C++中得到支持。

标准的解决方案似乎是使用继承,因为基类可以是零大小的,但是我的结构也可以由程序集访问,为了使程序集更简单,如果float b;在结构的末尾而不是开头更好,而且无论如何,这是不能保证的。

因此,这似乎留下了模板专门化作为唯一的选择,但我的类实际上相当长,我希望避免重复所有的东西。有没有我错过的另一个解决方法?

共有1个答案

左凯定
2023-03-14

我的一个同事想出了一个相当不错的解决办法。它确实需要复制和粘贴数据成员,但至少我不必重复我的方法。

template <bool HasFloat>
struct Foo {
  struct State {
    std::vector<int> a;
  };

  struct StateWithFloat {
    std::vector<int> a;
    float k;
  };

  using FooState = std::conditional_t<HasFloat, StateWithFloat, State>;
  FooState state;
};

你可以做:

  struct StateWithFloat {
    State state;
    float k;
  };

但您必须添加模板函数以避免state.astate.a之间的问题,此时复制和粘贴似乎更容易。

 类似资料:
  • 主要内容:使用“键值对”初始化结构体,使用多个值的列表初始化结构体,初始化匿名结构体结构体在实例化时可以直接对成员变量进行初始化,初始化有两种形式分别是以字段“键值对”形式和多个值的列表形式,键值对形式的初始化适合选择性填充字段较多的结构体,多个值的列表形式适合填充字段较少的结构体。 使用“键值对”初始化结构体 结构体可以使用“键值对”(Key value pair)初始化字段,每个“键”(Key)对应结构体中的一个字段,键的“值”(Value)对应字段需要初始化的值。 键值对的

  • 是否有人知道此显式特化是否有效: clang 主干 (12/3/2013) 给出以下错误: f:...\test.cpp:36:20: 错误: 从类 'O' 中出线定义 “Fun” 没有定义 1生成错误。 任何来自标准的支持参考来证明你的答案将不胜感激! 注意:我有点惊讶这是一个错误——我认为应该为任何以< code >开始实例化“Fun”的模板参数族选择专门化 这是一个叮当的错误还是我期望中的错

  • 这似乎应该是简单的,但我没有找到太多相关的它。我有一个结构,它有不同的字段用来存储关于程序操作的数据。我想记录这些数据,以便以后分析。试图在程序运行过程中连续记录数据会消耗大量资源。因此,我只想在数据发生变化时调用日志记录函数。如果有一种有效的方法来检查结构成员是否更新了,我会很高兴的。目前我正在玩一个有3个结构(旧的、当前的和新的)的shell游戏,以便检测数据何时发生了变化。提前道谢。

  • 给予 什么是?它是实现定义的还是未定义的行为?C和C的答案不同吗?

  • 此代码编译: 该代码不: 报告的错误(在 MSVC、gcc 和 clang 中)表明他们认为 构造函数未定义或不是 ,例如。从叮叮当当: 为什么? (可能与这个问题有关,但在使用时应该是完整的;只有仍然不完整。

  • 我试图在变量函数模板上使用'decltype'来获取其返回值类型,然后使用它来定义成员变量。但我一直在犯这样的错误: 基本上,decltype失败并将声明为int,而不是推断的返回类型。 它的工作原理是当我提供的所有参数的值,但这不是我要找的行为。因为我不知道该函数有多少参数,所以它必须保持为可变模板函数。 我计划如何使用类模板的示例: 如果我没有任何成员变量,并使用作为: 它编译,因此我相信能够