我一直在大量使用static_assert
(以及标准化之前的变体)。我相信我们中的许多人都将它们用于确保敏感数据结构的大小在跨平台和配置时保持不变。例如:
class SizeSensitiveClass
{
// ...
};
static_assert (sizeof(SizeSensitiveClass) == 18, "Check the size!");
现在,我编写了一个方便的宏来帮助这个特殊用途:
#define STATIC_ASSERT_SIZE(T, sz) (sizeof(T) == (sz), "Size of '" #T "' doesn't match the expected value.")
像这样使用:
STATIC_ASSERT_SIZE (SizeSensitiveClass, 18);
产生这个输出:(在编译时,显然,以编译错误的形式)
“SizeSensitiveClass”的大小与预期值不匹配。
这很好,但我想知道我是否可以扩展这个宏的实现(保持接口完整)以输出数据结构的当前大小和预期大小。理想情况下,输出应该类似于:
“SizeSensitiveClass”的大小与预期值不匹配(20 对 18)。
即使是目前的尺寸也会非常方便。这可能吗?
我正在使用 VC12 (Visual C++ 2013) 和 GCC 4.8.1。我很感激任何至少可以移植到这两个的解决方案/技术/方法。
我应该提到我已经尝试过常见的“字符串化”技巧,但它不起作用(正如人们所期望的那样)。它只是sizeof(T)
在输出中产生文字字符串。
我有一个模糊的概念,这可能是使用constexpr
s (生成消息字符串)来实现的,但我不熟悉它们。