Макрос с каким-то условием - PullRequest
0 голосов
/ 23 декабря 2010

Я пытаюсь создать макрос, чтобы уберечь меня от некоторого набора текста и сделать его более удобным / легким для определения свойства, вот что я имею в виду:

#define DefineProperty(Access, Type, Name) \
property<Access, Type> ##Name; \
void Set##Name(Type); \
Type Get##Name(void); \

Где Access - это перечисление с тремя возможными значениями: ReadOnly, WriteOnly и ReadWrite. Метод в макросе должен быть определен только в том случае, если для метода подходит значение доступа.

Возможно ли это, например, с помощью метапрограммирования?

Ответы [ 2 ]

5 голосов
/ 23 декабря 2010

Да, вы можете сделать это довольно легко:

#define DefineGetReadOnly(Name, Type)  Type Get##Name();
#define DefineGetReadWrite(Name, Type) Type Get##Name();
#define DefineGetWriteOnly(Name, Type)

#define DefineProperty(Access, Type, Name) \
    DefineGet##Access(Name, Type)

Замена макроса происходит следующим образом:

DefineProperty(ReadOnly, int, Foo)
DefineGetReadOnly(Foo, int)
int GetFoo();

DefineProperty(WriteOnly, int, Bar)
DefineGetWriteOnly(Bar, int)
/* no tokens */
0 голосов
/ 23 декабря 2010

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

Я не могу поделиться всем этим, она является собственностью и не принадлежит мне.Но я могу указать вам направление, которое мне показалось наиболее простым в использовании.Ознакомьтесь с методами, описанными в 9.5 Метапрограммирования шаблонов C ++ Абрахамсом и Гуртовым.Сравните это с такими объектами, как boost :: tuple и boost :: fusion.Обратите внимание, что вы можете объявлять «имена», определяя новые типы.Таким образом, вы можете создать что-то, что вы можете использовать, например, так:

struct object_with_properties : construct_property_object< mpl::vector< mpl::pair< property<access,type>, name> ... > >::type
{};

object_with_properties owp;
get<name>(owp);
set<name>(owp, value);

// or maybe
get<name>(owp) = value;

Моя система фактически позволяет вам определять такие объекты, свойства которых реализуются функциями.Хотя это намного сложнее, и я не нашел способа упростить его до вышеуказанной степени.Для этого я начал со статьи под названием «Поддержка отражений с помощью шаблонного метапрограммирования», которая где-то в сети ... могла бы достать ее из ACM.

...