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

标签 c++ templates

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 的对象,我使用 union 来组合我的数据字段并使用 data 缓冲区来完成它。我想确保数据足以容纳数据成员的集合,以防将来有人扩展它们,所以我添加了这个静态断言。

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

这种方法有两个问题。首先,编译器提示 union 不公开。其次,这应该适用于任何容器类型 T,所以我不想具体说明,但将 int 作为虚拟类型是行不通的,但我不想仅仅为了静态断言而引入另一种类型, 有没有办法在这里使用虚拟类型?

有没有更优雅的解决方案?

编辑:James,感谢您提出可移植性问题。字节序和对齐是合法的问题,但就我而言,序列化/反序列化发生在本地,所以没关系。

最佳答案

Is there a more elegant solution?

为什么不直接将结构重新解释为字符数组?

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

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

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

关于c++ - 我可以在不提供真实模板参数的情况下使用 static_assert 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4819350/

相关文章:

c++ - 我如何在 NAO v6 中使用 C++ 进行编程?

c++模板没有合适的默认构造函数

javascript - 使用像 Mustache.js 这样的模板引擎

c++ - 是否应该为类成员访问表达式中的依赖类/命名空间名称延迟名称查找?

php - 如何在 ZF2 中渲染带有布局的邮件模板?

c++ - map 的替代品

c++ - 为什么这个 std::sort 比较失败了?

c++ - 在 Qt 中的两种不同布局中使用相同的小部件

c++ - ASSERT(::IsWindow(m_hWnd)) 问题,不知道哪里出了问题

c++ - 模板集合的不同排序方法