Nano Hash - криптовалюты, майнинг, программирование

Структура Boost Fusion с шаблонным типом с несколькими аргументами закрывает запятую

Как я могу создать следующую структуру Boost Fusion?

#include <array>
#include <boost/fusion/include/define_struct_inline.hpp>

BOOST_FUSION_DEFINE_STRUCT_INLINE(
  MyStruct,
  (std::array<int, 3>, foo)
)

Это не скомпилируется (GCC 4.8.1 и Boost 1.53), потому что std::array<int, 3> интерпретируется как 2 аргумента вместо 1.

Обратите внимание, что я НЕ спрашиваю об особом случае, показанном выше (это просто пример). Эта конкретная проблема имеет тривиальное решение — просто использовать typedef std::array<int, 3> Int3Array;.

Я спрашиваю об общей проблеме использования типов с несколькими аргументами шаблона, разделенными запятыми, в качестве типа в списке полей структуры Boost Fusion. В конце концов, я хочу использовать шаблонную структуру Boost Fusion, в которой я не могу заранее определить определения типов. Например, я мог бы захотеть сделать что-то вроде этого:

BOOST_FUSION_DEFINE_TPL_STRUCT_INLINE(
  (A)(B)(C),
  MyAdvancedStruct,
  (A<B, C>, bar)
)
08.05.2014


Ответы:


1

Обходной путь, который работает, может быть

BOOST_FUSION_DEFINE_STRUCT_INLINE(
  MyStruct,
  (decltype(std::array<int, 3>()), foo)
)

Конечно, чтобы сделать его /обще/ применимым

BOOST_FUSION_DEFINE_STRUCT_INLINE(
MyStruct,
(boost::remove_reference<decltype(std::declval<std::array<int, 3>>())>::type, foo)
)

Кажется, это требует другого макроса... но, подождите :) BOOST_PP_COMMA кажется лучшим выбором.

Подтверждение концепции: http://coliru.stacked-crooked.com/a/f8b407b810fcfdc0.

08.05.2014
  • Это здорово, спасибо! Правильно ли я понимаю, что ваше общее решение (с std::declval и т.д.) необходимо, если тип не имеет конструктора по умолчанию (т.е. decaltype(Type()) не будет работать)? Если это так, эта ситуация никогда не возникнет, потому что, если вы используете тип без конструктора по умолчанию в структуре Boost Fusion, вы получаете ошибку времени компиляции, когда Boost пытается реализовать конструктор по умолчанию для структуры... Но хорошо, что вы упомянули это общее решение для полноты. 09.05.2014
  • Как я могу заставить это работать с BOOST_PP_COMMA? (std::array<int BOOST_PP_COMMA() 3>, foo) не работает. 09.05.2014
  • @Флекто ага. Оказывается ты прав. Что ж, тогда мой обходной путь заслуживает внимания. Я надеюсь, что ваши классы по умолчанию являются конструируемыми, поэтому вам не нужен этот ужасный declval<> танец. 09.05.2014

  • 2

    Если вы не можете использовать объявление typedef или using, попробуйте использовать Boost.IdentityType вот так:

    #include <array>
    #include <boost/fusion/include/define_struct_inline.hpp>
    #include <boost/utility/identity_type.hpp>
    
    BOOST_FUSION_DEFINE_STRUCT_INLINE(
      MyStruct,
      (typename BOOST_IDENTITY_TYPE((std::array<int, 3>)), foo)
    )
    
    int main()
    {
        MyStruct x;
        static_assert(boost::is_same<decltype(x.foo), std::array<int, 3> >::value, "yup");
    }
    

    См. демонстрацию Coliru в реальном времени.

    23.03.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..