Самый простой способ сделать это, вероятно, использовать контейнер RAII для сброса значения:
// Assumes T's assignment does not throw
template <typename T> struct ResetValue
{
ResetValue(T& o, T v) : object_(o), value_(v) { }
~ResetValue() { object_ = value_; }
T& object_;
T value_;
};
используется как:
{
ResetValue<int> resetter(xyz, 123);
// ...
}
Когда блок заканчивается, деструктор будетвызывать, возвращая объект к указанному значению.
Если вы действительно хотите использовать макрос, если это относительно простое выражение, вы можете сделать это, используя forблок:
for (bool b = false; b == false; b = true, (xyz = 123))
{
// ...
}
, который можно превратить в макрос:
#define DO_AFTER_BLOCK(expr) \
for (bool DO_AFTER_BLOCK_FLAG = false; \
DO_AFTER_BLOCK_FLAG == false; \
DO_AFTER_BLOCK_FLAG = true, (expr))
, используемый как:
DO_AFTER_BLOCK(xyz = 123)
{
// ...
}
Я не думаю, что макро подходхорошая идея;Вероятно, я бы смутился, если бы увидел это в рабочем исходном коде.