А>Было такое 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.