繁体   English   中英

我可以在不提供真实模板参数的情况下static_assert吗?

[英]Can I static_assert without providing a real template parameter?

template<typename T>
class MyClass
{
......
private:
    union u_
    {
        struct m_
        {
            int i1;
            int i2;
            int i3;
        } m;
        char data[SIZE]; // convenience buffer for serialization/deserialization;
    } u;
    T container;
......
};

为了能够序列化/反序列化MyClass的对象,我使用联合来合并我的数据字段,并使用数据缓冲区进行批量批发。 我想确保数据足够大,以便收集数据成员以防将来有人扩展它们,所以我添加了这个静态断言。

static_assert(sizeof(MyClass<int>::u_::data) >= sizeof(MyClass<int>::u_::m_));

这种方法存在两个问题。 首先,编译器抱怨该联合不是公开的。 其次,这对于任何容器类型T都应该成立,因此我不想具体说明,但是将int作为虚拟类型不起作用,但是我不想为了静态断言而引入另一个类型,有没有办法在这里使用虚拟类型?

有更优雅的解决方案吗?

编辑 :詹姆斯,谢谢提出了可移植性问题。 字节序和对齐是合法的问题,但在我的情况下,序列化/反序列化在本地发生,所以没关系。

有更优雅的解决方案吗?

为什么不将结构重新解释为char数组呢?

struct m_
{
    int i1;
    int i2;
    int i3;
};

// ...
m_ m;
char* data = static_cast<char*>(static_cast<void*>(&m));

任何对象都可以安全地重新解释为char数组。 当然,您仍然需要担心对齐,填充,数据类型的大小,潜在的字节序和其他表示问题,但可能您知道,因为您正在编写序列化实现。

char data[SIZE]; 

而不是这个,你可以这样做:

char data[sizeof(m_)]; 

它总是满足static_assert的条件:

static_assert(sizeof(MyClass<int>::u_::data) >= sizeof(MyClass<int>::u_::m_));

因为它会永远满足,不管是什么,你甚至不需要static_assert

要解决private问题,您可以考虑将static_assert放在类中的某个位置,例如构造函数或静态方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM