Intereting Posts
Копирование буфера визуализации глубины в буфер глубины Ошибка использования параметра constexpr в качестве параметра шаблона в пределах одного classа Использование Eigen :: VectorXd (Eigen 3.3.4) в качестве типа состояния в boost :: numeric :: odeint (Boost 1.65.1) Округление двойного числа до десятого места нет жизнеспособного перехода от ‘int’ к ‘Student’ Как создать новый тип в MPI Можно создать одноэлементную структуру на C ++? Как? Использование QAbstractVideoSurface Почему композиция пространства имен так редко используется? C ++ 11 RegEx Matching – я не могу заставить его работать правильно C ++ для проверки однотонных указателей Есть ли способ избежать этого предупреждения из clang-tidy (fuchsia-default-arguments) при инициализации строки? Правильно перегрузите stringbuf для замены cout в mex-файле MATLAB Вычисление шаблонов Variadic в шаблоне вариационных шаблонов Как установить QNetworkCookieJar в QWebEngine?

Обертывание последовательности Boost.Fusion

Я ищу способ создания оболочки последовательности Boost.Fusion , которая сама является последовательностью Fusion и пересылает все «вызовы» в свою завернутую последовательность. Что-то в строках

template struct sequence_wrapper { explicit sequence_wrapper( Sequence const& s ) : seq( s ){} Sequence seq; }; 

где sequence_wrapper является последовательностью Fusion и работает так же, как и Sequence . Причина, по которой я нуждаюсь в этом, заключается в том, что у меня есть несколько функций, которые работают с последовательностями Fusion (где все элементы удовлетворяют некоторым специальным требованиям), и я хотел бы добавить некоторый синтаксический сахар, для которого мне нужен особый тип для добавления перегруженных операторов. Мне не нужен результат операций над sequence_wrapper, чтобы возвращать sequence_wrapper, а только связанные с синтаксисом вызовы, связанные с сахаром, возвращают (вручную) завернутую последовательность. Например, добавление элементов в последовательность с использованием оператора запятой (несколько последовательностей Boost.Assign для Fusion ):

 template sequence_wrapper< typename boost::fusion::result_of::push_back::type > operator ,( Sequence const& seq, T const& v ) { return sequence_wrapper< typename boost::fusion::result_of::push_back::type >( boost::fusion::push_back( seq, v ) ) ; } 

Какой был бы лучший способ достичь этого (если он действительно поддерживается библиотекой)? Я особенно стараюсь избегать создания последовательности Fusion с нуля, так как я хотел бы использовать любую последовательность, возвращаемую операциями Fusion . Будет ли наследование + специализация tag_of возвращать тег завернутой последовательности, только что сработает? Или мне нужно определить собственный тег и реализовать все необходимые функции, чтобы просто переслать вызов?

Это то, что я закончил:

 template< typename Derived , typename Sequence , typename TraversalTag = typename boost::fusion::traits::category_of< Sequence >::type , typename IsView = typename boost::fusion::traits::is_view< Sequence >::type > class fusion_sequence_wrapper : public boost::fusion::sequence_facade< Derived, TraversalTag, IsView > { typedef Sequence base_sequence_type; public: explicit fusion_sequence_wrapper( base_sequence_type const& sequence ) : _seq( sequence ) {} base_sequence_type const& base() const { return _seq; } base_sequence_type& base() { return _seq; } public: template< typename Seq > struct begin { typedef typename boost::fusion::result_of::begin< typename boost::mpl::if_< boost::is_const< Seq > , base_sequence_type const , base_sequence_type >::type >::type type; static type call( Seq& s ){ return boost::fusion::begin( s._seq ); } }; template< typename Seq > struct end { typedef typename boost::fusion::result_of::end< typename boost::mpl::if_< boost::is_const< Seq > , base_sequence_type const , base_sequence_type >::type >::type type; static type call( Seq& s ){ return boost::fusion::end( s._seq ); } }; template< typename Seq > struct size { typedef typename boost::fusion::result_of::size< typename boost::mpl::if_< boost::is_const< Seq > , base_sequence_type const , base_sequence_type >::type >::type type; static type call( Seq& s ){ return boost::fusion::size( s._seq ); } }; template< typename Seq > struct empty { typedef typename boost::fusion::result_of::empty< typename boost::mpl::if_< boost::is_const< Seq > , base_sequence_type const , base_sequence_type >::type >::type type; static type call( Seq& s ){ return boost::fusion::empty( s._seq ); } }; template< typename Seq, typename N > struct at { typedef typename boost::fusion::result_of::at< typename boost::mpl::if_< boost::is_const< Seq > , base_sequence_type const , base_sequence_type >::type , N >::type type; static type call( Seq& s ){ return boost::fusion::at( s._seq ); } }; template< typename Seq, typename N > struct value_at { typedef typename boost::fusion::result_of::value_at< typename boost::mpl::if_< boost::is_const< Seq > , base_sequence_type const , base_sequence_type >::type , N >::type type; }; private: base_sequence_type _seq; };