Определите структуру с более чем 40 полями, используя BOOST_HANA_DEFINE_STRUCT в Boost::Hana

Определение структуры с более чем 40 полями с помощью макроса BOOST_HANA_DEFINE_STRUCT в библиотеке Boost::hana, например,

#include <boost/hana/define_struct.hpp>
namespace hana = boost::hana;

// a simple struct having 41 fields
struct Foo {
    BOOST_HANA_DEFINE_STRUCT(Foo,
        (int, bar_0),
        (int, bar_1),
        ...,
        (int, bar_40)
    );
};

вызовет ошибку компиляции

pasting "BOOST_HANA_DEFINE_STRUCT_IMPL_" and "(" does not give a valid preprocessing token.

Глубоко изучив исходный код Hana, можно обнаружить, что в файле boost/hana/detail/struct_macros.hpp все макросы определены жестко запрограммированными реализациями из шаблона,

...
#define BOOST_HANA_DEFINE_STRUCT_IMPL_40(TYPE , m1, m2, ..., m39) \
#define BOOST_HANA_DEFINE_STRUCT_IMPL_41(TYPE , m1, m2, m3, ..., m40) \

Итак, мой вопрос

  1. Как я могу определить новое максимальное число аргументов, например 128, и перегенерировать макросы, чтобы можно было передать больше аргументов?

  2. Является ли хорошей практикой использование такой структуры, реализованной кортежем Hana, но имеющей слишком много полей? Если это не очень хороший дизайн, какая альтернатива рекомендуется?

Большое спасибо!


person David Wu    schedule 19.12.2019    source источник
comment
Вы уверены, что вам действительно нужна структура из 40+ полей? Ни один из них не может быть осмысленно сгруппирован во вложенные структуры?   -  person yuri kilochek    schedule 19.12.2019
comment
@yurikilochek Спасибо за хороший дизайн. Данные загружаются из вышестоящего источника, а поля имеют параллельные значения, поэтому их неудобно группировать. Технически возможно ли увеличить лимит ханы?   -  person David Wu    schedule 19.12.2019
comment
только макрос имеет ограничение   -  person Jason Rice    schedule 08.01.2020


Ответы (1)


Существует файл boost/hana/detail/struct_macros.hpp.erb, который можно использовать для регенерации boost/hana/detail/struct_macros.hpp с помощью

MAX_NUMBER_OF_MEMBERS=55 erb struct_macros.hpp.erb > struct_macros.hpp
person Pavel Krasnopevtsev    schedule 30.06.2020