Re: Macro реализующее "скрытый дополнит." аргумент macro
От: Andrew S Россия http://alchemy-lab.com
Дата: 09.06.10 21:06
Оценка:
А>Было такое macro, упрощенно:
А>
А>#define DEFINE_TRANSACTION(T, NAME, ARGT)    static T NAME(ARGT arg){ \
А>    int encript = 0; /* encript result or no. Always 0 */ \
А>    T    result; \
А>    . . .
А>}
А>


Как то так, тоже упрощенно:

#include <boost/preprocessor/cat.hpp>

#define TRANSACTION_ENCRYPTION_TRANSACTION_ENCRYPTION 0,
#define TRANSACTION_ENCRYPTION_TRANSACTION_ENCRYPTION_TRANSACTION_ENCRYPT 1

#define TRANSACTION_ENCRYPTION(x) BOOST_PP_CAT(TRANSACTION_ENCRYPTION_, x),
#define TRANSACTION_ENCRYPTION_I(x) ( BOOST_PP_CAT(TRANSACTION_ENCRYPTION_, TRANSACTION_ENCRYPTION x) )


#define GET_TRANSACTION_ENCRYPTION_I(is_encrypt, ret_type) is_encrypt
#define GET_TRANSACTION_ENCRYPTION(x) GET_TRANSACTION_ENCRYPTION_I TRANSACTION_ENCRYPTION_I(x)

#define GET_TRANSACTION_RET_TYPE_I(is_encrypt, ret_type) ret_type
#define GET_TRANSACTION_RET_TYPE(x) GET_TRANSACTION_RET_TYPE_I TRANSACTION_ENCRYPTION_I(x)

#define ENCRYPT(x) (TRANSACTION_ENCRYPT) x

#define DEFINE_TRANSACTION(ret_type, name, arg_type) \
static GET_TRANSACTION_RET_TYPE(ret_type) name(arg_type arg) \
{ \
     int encrypt = GET_TRANSACTION_ENCRYTION(ret_type); \
     GET_TRANSACTION_RET_TYPE(ret_type) result; \
     return result; \
}


если бустовый препроцессор на С не работает или низзя, то cat оттуда легко изъять.
А синтаксис, если уж нельзя от макроса убежать, лучше изменить на DEFINE_TRANSACTION((ENCRYPT) param1, param2 etc).
Удачи.

PS а трюк в том числе использовался тут: http://www.rsdn.ru/article/files/libs/RPCLib.xml
Автор(ы): Andrew Solodovnikov, Mike Kostuyhin
Дата: 28.12.2008
Мы не проводили социологических исследований, но и без них очевидно, что C++-программисты в большинстве случаев предпочтут написать все, начиная чуть ли не с ОС. Библиотеки, которые широко используются, можно пересчитать по пальцам одной руки. Поэтому неудивительно, что в интернете можно найти целую кучу реализаций RPC, похожих на Microsoft DCOM. Данная статья, на первый взгляд, выглядит еще одной реализацией библиотеки удаленного доступа к объектам, однако данная библиотека обладает рядом особенностей, делающих ее описание заслуживающим внимания. Ее отличают от других высокая производительность, возможность легкой смены транспортного уровня, реализация без использования внешних утилит и совместимость со старыми компиляторами, например, VC++ 6.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.