Рекурсивный вариационный макрос в MSVC 2010 - PullRequest
0 голосов
/ 28 июня 2019

Я, к сожалению, работаю с Visual Studio 2010 и застрял без возможности использовать такие функции c ++ 11, как constexpr.Это вызывает сожаление, поскольку мы пытаемся сделать некоторые махинации времени компиляции, чтобы упростить разработку исходного кода и поймать некоторые распространенные ошибки в нашей кодовой базе во время компиляции / в intellisense.

Я по сути создаю структуру отображения, совместимую с дополнением кода.Существует ряд объектов, созданных с помощью параметра шаблона, который содержит объекты, которые ссылаются на другие статические объекты в пространстве имен.

Пока это делает сборку неудачной, когда сопоставление невозможно или недопустимо.Если сопоставленный объект не существует, положение в сопоставленном объекте невозможно, или слишком много или два из них предоставлены, если ошибка очень четко показана.Это поведение, которое мне нужно сохранить.

Я уже создал макрос, который помогает избавиться от котельной плиты и работает довольно хорошо.Однако для некоторых людей инициализация все еще немного многословна, поскольку каждый подобъект должен быть индивидуально заполнен для каждой строки.

Мы хотели бы создать макрос, который позволяет размещать последовательные строки подобъекта, который мы помещаем в структуру отображения, в одну строку.

Я пытался создать рекурсивный вариационный макрос, который расширяет одну ссылку на подобъект и список позиций.В идеале можно указать только минимальное и максимальное значения в перечислении позиций, однако полный список также будет означать движение в правильном направлении.

//Types

enum otherPosition{
   p0
   p1,
   p2,
   p3,
   p4,
   maxP
};

OtherObject other1, other2, other3;

class Sub{
     Sub(OtherObect& mapped, const otherPosition mappedPosition); 
...
};

template<size_t SIZE> 
class ContainerObject{
     ContainerObject(boost::array<Sub,SIZE>& mappedObjects); 
...
};

//Raw initialization

ContainerObject<5> objectA( 
     boost::array<5> inputs = { 
          Sub(other1, p0),
          Sub(other1, p1),
          Sub(other1, p2),
          Sub(other2, p0),
          Sub(other3, p3)
});

//Using Macro

MAKE_CONTAINER(ObjectA, 5, {
          Sub(other1, p0),
          Sub(other1, p1),
          Sub(other1, p2),
          Sub(other2, p0),
          Sub(other3, p3)
});

//How we want it to work

MAKE_CONTAINER(ObjectA, 5, {
          CONSECUTIVE_SUB(other1, p0, p2),
          Sub(other2, p0),
          Sub(other3, p3)
});

Я не могу понять, как заставить этот макрос CONSECUTIVE_SUB работать правильно.Кажется, он отказывается расширяться до

Sub(other1, p0), 

, не говоря уже о

Sub(other1, p0), Sub(other1, p1), Sub(other1,p2),

Кто-нибудь знает, как этого добиться?

...