在一行中 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.");
如果你可以使用c++14 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 c++14.
中禁止变量声明和使用 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;
};
未经测试,可能包含错误。
如何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.");
如果你可以使用c++14 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 c++14.
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;
};
未经测试,可能包含错误。