在一行中 static_assert 3 个或更多项目的最干净的方法

the most clean way to static_assert 3 or more items in oneline

如何static_assert 3 项在编译时相同。

union
{
    std::uint32_t   multibyte;
    std::uint8_t    bytes[4];
} test;

static_assert(sizeof(test) == sizeof(test.multibyte) == sizeof(test.bytes), "Union size mismatch.");

所以这里的static_assert当然会失败,因为最后一次检查将是1 == 4。除了

还有更干净的方法吗
static_assert(sizeof(test.bytes) == sizeof(test.multibyte) && sizeof(test) == sizeof(test.bytes), "Union size mismatch.");

如果你可以使用 then by the following example you can static_assert instances too, if they can be used in a constant expression:

template<typename T, typename... Ts>
constexpr bool compare_sizes(T&&, Ts&&...) noexcept {
    using expand = int[];
    bool result = sizeof...(Ts) > 0;

    static_cast<void>(expand {
        0, (static_cast<void>(result &= (sizeof(Ts) == sizeof(T))), 0)...
    });
    return result;
}

使用您的 union { /* ... */ } test 的示例:

static_assert(compare_sizes(test, test.multibyte, test.bytes), "Size mismatch.");

请注意,constexpr function body until .

中禁止变量声明和使用 static_cast 语句

您可以为此编写一个结构:

template<typename...> struct AllSame;

template<typename Arg1, typename Arg2, typename... Args>
struct AllSame<Arg1, Arg2, Args...>
{
    static constexpr bool value = sizeof(Arg1) == sizeof(Arg2) && AllSame<Arg1, Args...>::value;
};

template<typename Arg>
struct AllSame<Arg>
{
        static constexpr bool value = true;
};

未经测试,可能包含错误。