gpt4 book ai didi

c++ - 递归编译结构的大小减去填充

转载 作者:行者123 更新时间:2023-12-02 09:59:17 24 4
gpt4 key购买 nike

我有与此question类似的问题。
我想在编译时获得结构的大小,包括所有未添加编译器特定填充的子结构。

struct Bar {
BOOST_HANA_DEFINE_STRUCT(Bar,
(std::uint8_t, a),
(std::uint16_t, b)
);
};

struct Foo {
BOOST_HANA_DEFINE_STRUCT(Foo,
(std::uint8_t, a),
(std::uint16_t, b),
(std::uint32_t, c),
(std::uint64_t, d),
(Bar, bar)
);
};

template <typename T>
constexpr auto bytesize() -> size_t
{
if constexpr (std::is_arithmetic<T>::value || std::is_enum<T>::value)
return sizeof(T);
else if constexpr (std::is_class<T>::value)
{
return hana::fold_left(
hana::accessors<T>(), 0, [](auto total, auto member) {
// I want to call bytesize recusively here:
return bytesize<decltype(hana::second(member)(std::declval<T>()))>() + total;
});
}
}

static_assert(bytesize<Foo>() == 18);
因为我不想包括填充,所以我希望struct Foo的大小为18(包括子结构 Bar的大小),但是链接问题中的代码确实在计算中包括了填充,并给了我一个大小of 19问题在于,函数应该在遇到的所有结构上递归调用字节大小。
可以在 here中找到一个无法按预期运行的最小示例。

最佳答案

您遇到的返回类型不是您期望的类型(额外&&)。 std::decay_t解决了该问题:

return hana::fold_left(
hana::accessors<T>(), 0, [](auto total, auto member) {
using member_type = std::decay_t<decltype(hana::second(member)(std::declval<T>()))>;
constexpr auto member_size = bytesize<member_type>();

return total + member_size;
});
Demo

关于c++ - 递归编译结构的大小减去填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63519619/

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