Я пытаюсь использовать Boost MPL и Fusion для расчета размера структуры без учета каких-либо дополнений. Это моя текущая лучшая попытка:
template<class T>
constexpr std::size_t sizeof_members(void)
{
using namespace std;
namespace mpl = boost::mpl;
namespace fusion = boost::fusion;
//This works, but only for structs containing exactly 4 members...
typedef typename mpl::apply<mpl::unpack_args<mpl::vector<mpl::_1, mpl::_2, mpl::_3, mpl::_4>::type >, T>::type member_types;
typedef typename mpl::transform<member_types, mpl::sizeof_<mpl::_1> >::type member_sizes;
typedef typename mpl::accumulate<member_sizes, mpl::int_<0>, mpl::plus<mpl::_1, mpl::_2> >::type sum;
return sum();
}
BOOST_FUSION_DEFINE_STRUCT(
(), Foo_t,
(std::uint8_t, a)
(std::uint16_t, b)
(std::uint32_t, c)
(std::uint64_t, d)
);
static_assert(sizeof_members<struct Foo_t>() == 15);
int main()
{
std::cout << "sizeof_members = " << sizeof_members<struct Foo_t>() << std::endl;
std::cout << "sizeof = " << sizeof(struct Foo_t) << std::endl;
return 0;
}
Ожидаемый результат:
sizeof_members<struct Foo_t>() = 15
sizeof(struct Foo_t) = 16
Я могу преобразовать последовательность типов в последовательность целых чисел, содержащую размер каждого типа, и я могу вычислить сумму по этой последовательности, но у меня возникают проблемы с первым шагом преобразования структуры в последовательность типов. В документации Fusion говорится, что BOOST_FUSION_DEFINE_STRUCT генерирует шаблон для определения и адаптации произвольной структуры в качестве модели последовательности произвольного доступа, которая, как я считаю, должна быть совместима с mpl::transform, однако, похоже, для этой работы мне не хватает некоторого связующего кода. . Мой текущий подход с использованием mpl::unpack_args работает, но только для структур с четырьмя полями.
Как я могу распространить это на произвольные структуры с большим или меньшим количеством полей?
How can I extend this to arbitrary structs?
Что такое произвольные структуры? Вы имеете в виду, что для структур, не объявленных с использованиемBOOST_FUSION
? Вы не можете - С++ не имеет отражения. - person KamilCuk   schedule 02.06.2020