gpt4 book ai didi

c++ - static_assert 参数包中每个参数的大小

转载 作者:行者123 更新时间:2023-11-30 04:53:57 27 4
gpt4 key购买 nike

我正在尝试检查参数包中的每个参数是否可以存储在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com