Здравствуйте, Andrew S, Вы писали:
AS>Как то так, тоже упрощенно:
AS>AS>#include <boost/preprocessor/cat.hpp>
AS>#define TRANSACTION_ENCRYPTION_TRANSACTION_ENCRYPTION 0,
AS>#define TRANSACTION_ENCRYPTION_TRANSACTION_ENCRYPTION_TRANSACTION_ENCRYPT 1
AS>#define TRANSACTION_ENCRYPTION(x) BOOST_PP_CAT(TRANSACTION_ENCRYPTION_, x),
AS>#define TRANSACTION_ENCRYPTION_I(x) ( BOOST_PP_CAT(TRANSACTION_ENCRYPTION_, TRANSACTION_ENCRYPTION x) )
AS>#define GET_TRANSACTION_ENCRYPTION_I(is_encrypt, ret_type) is_encrypt
AS>#define GET_TRANSACTION_ENCRYPTION(x) GET_TRANSACTION_ENCRYPTION_I TRANSACTION_ENCRYPTION_I(x)
AS>#define GET_TRANSACTION_RET_TYPE_I(is_encrypt, ret_type) ret_type
AS>#define GET_TRANSACTION_RET_TYPE(x) GET_TRANSACTION_RET_TYPE_I TRANSACTION_ENCRYPTION_I(x)
AS>#define ENCRYPT(x) (TRANSACTION_ENCRYPT) x
AS>#define DEFINE_TRANSACTION(ret_type, name, arg_type) \
AS>static GET_TRANSACTION_RET_TYPE(ret_type) name(arg_type arg) \
AS>{ \
AS> int encrypt = GET_TRANSACTION_ENCRYTION(ret_type); \
AS> GET_TRANSACTION_RET_TYPE(ret_type) result; \
AS> return result; \
AS>}
AS>
Спасибо, суть ясна. Это то, что и требовалось. Но теперь меня начинает беспокоить вопрос: а на сколько это переносимо? Дело в том, что в приведённом Вами виде, с учётом исправления опечатки в строке
int encrypt = GET_TRANSACTION_ENCRYTION(ret_type); \
на
int encrypt = GET_TRANSACTION_ENCRYPTION(ret_type); \
, код не компилируется GCC 4.5.0.
GCC 4.5.0 успешно компилирует в таком виде:
#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_II(is_encrypt, ret_type) is_encrypt
#define GET_TRANSACTION_ENCRYPTION_I(x) GET_TRANSACTION_ENCRYPTION_II(x)
#define GET_TRANSACTION_ENCRYPTION(x) GET_TRANSACTION_ENCRYPTION_I (TRANSACTION_ENCRYPTION_I(x))
#define GET_TRANSACTION_RET_TYPE_II(is_encrypt, ret_type) ret_type
#define GET_TRANSACTION_RET_TYPE_I(x) GET_TRANSACTION_RET_TYPE_II(x)
#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_ENCRYPTION(ret_type); \
GET_TRANSACTION_RET_TYPE(ret_type) result; \
return result; \
}
Кстати фрагмент взятый отсюда:
http://www.rsdn.ru/article/files/libs/RPCLib.xmlАвтор(ы): Andrew Solodovnikov, Mike Kostuyhin
Дата: 28.12.2008
Мы не проводили социологических исследований, но и без них очевидно, что C++-программисты в большинстве случаев предпочтут написать все, начиная чуть ли не с ОС. Библиотеки, которые широко используются, можно пересчитать по пальцам одной руки. Поэтому неудивительно, что в интернете можно найти целую кучу реализаций RPC, похожих на Microsoft DCOM. Данная статья, на первый взгляд, выглядит еще одной реализацией библиотеки удаленного доступа к объектам, однако данная библиотека обладает рядом особенностей, делающих ее описание заслуживающим внимания. Ее отличают от других высокая производительность, возможность легкой смены транспортного уровня, реализация без использования внешних утилит и совместимость со старыми компиляторами, например, VC++ 6.
#define RPC_PARAM_RPC_PARAM_DIRECTION RPC_PARAM_DIRECTION_AUTO,
#define RPC_PARAM_RPC_PARAM_DIRECTION_RPC_IN RPC_PARAM_DIRECTION_IN
#define RPC_PARAM_RPC_PARAM_DIRECTION_RPC_OUT RPC_PARAM_DIRECTION_OUT
#define RPC_PARAM_RPC_PARAM_DIRECTION_RPC_INOUT RPC_PARAM_DIRECTION_INOUT
#define RPC_PARAM_DIRECTION(x) PPC_CAT(RPC_PARAM_DIRECTION_, x),
#define RPC_PARAM_WITH_DIRECTION(x) PPC_CAT(RPC_PARAM_, RPC_PARAM_DIRECTION x)
без аналогичной правки тоже не компилируется. Подозреваю, что мой вариант не будет работать в VS. А есть и другие компиляторы, да и разные версии ещё. Эх, в общем будем пробовать.
А за идею и за то что меня "ткнули носом", ещё раз спасибо. А то у меня мЫшление всё как-то шло в другой плоскости