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

标签 c++ c++17 c++20

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

相关文章:

php - 在领域驱动设计中,存储库模式是否维护对对象的引用?

c# - 结构 - 初始化和写入文件

c++ - std::vector<std::wstring> 移动/重新分配内部 wstring.data() 合法吗?

c++ - Const std::filesystem::path 引用常量不受尊重,这是我做错的吗?

c++ - 在另一个类中创建一个类指针 vector ?

c++ - fstream 显示txt中的所有文本

c++ - 在模板类中定义模板化友元函数

c++ - 您如何逆转strong_ordering?

c++ - std::time_point往返于std::string

c++ - 有条件的平凡析构函数