我有一个模板化的结构,它有一个带有额外浮点数的变体,如下所示:
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