Первым делом: скрыть инструкцию возврата внутри макроса - это зло. Когда кто-то смотрит на эту функцию, совсем не ясно, что эти вызовы TWO_CMD
фактически вызывают возврат функции.
Самый простой способ сделать это - передать вызываемые объекты в шаблон функции и вернуть ему результат:
template <typename R, typename F, typename G>
R Evaluate(const F& f, const G& g) {
R x = f();
return x ? x : g();
}
Используется как:
return Evaluate<long>(
std::bind(&MyClass::Func<int>, this, a),
std::bind(&MyClass::Func<void>, this));
return Evaluate<long>(
std::bind(&MyClass::Func<double>, this),
std::bind(&MyClass::Func<std::string>, this, a));
Если ваш компилятор и стандартная библиотека не поддерживают C ++ 0x или C ++ TR1 bind
, в Boost есть реализация, которая почти идентична.
(Я назвал функцию Evaluate
, потому что я не могу придумать хорошее название для этой функции.)