我正在尝试检查参数包中的每个参数是否可以存储在 8 个字节以内(sizeof <= 8)
我有函数签名:
template <typename Return, typename... Arguments>
inline auto invoke(std::uint64_t hash, Arguments... arguments) -> Return
使用折叠表达式,我试过:
static_assert((sizeof(arguments) <= 8 && ...));
哪个编译失败,意外的标记“...”,预期的“表达式”
- 我认为它无效或不正确?
使用 C++20 的概念和约束,我假设一些事情是可能的?
template <typename Return, typename... Arguments> requires (sizeof(arguments) <= 8 || ...)
inline auto invoke(std::uint64_t hash, Arguments... arguments) -> Return
我假设有一种方法可以使用标准库来检查类型是否适合 std::uint64_t
也可以这样说吗?
最佳答案
有了 C++20 的概念,有很多方法可以实现所需的行为。例如:
template <typename T, size_t N>
concept bool SizeLessEqual = sizeof(T) <= N;
template <SizeLessEqual<8>... Types>
void f() { }
int main() {
f<bool, char, int, double>();
f<std::string>(); // error
}
现场演示:https://wandbox.org/permlink/Q9tifNVplsx9BjGN
另一种选择是您的解决方案:
template <typename... Types> requires ((sizeof(Types) <= 8) && ...)
void f() { }
或者,例如:
template <typename... Types> requires (std::max({ sizeof(Types)... }) <= 8)
void f() { }
关于c++ - static_assert 参数包中每个参数的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53736632/