Народ а есть где нибудь в недрах буста (или не буста) класс, который принимает на вход класс и если выполнены некоторые условия, вызывает у него определенную функцию. Самому написать не проблема, но лень.
З.ы. не поверите в гугле таки забанили.
Здравствуйте, denisko, Вы писали:
D>Народ а есть где нибудь в недрах буста (или не буста) класс, который принимает на вход класс и если выполнены некоторые условия, вызывает у него определенную функцию. Самому написать не проблема, но лень. D>З.ы. не поверите в гугле таки забанили.
ты слишком специализированные вопросы задаешь... суда по оценкам народ просто растерялся не найдя что ответить %)
Здравствуйте, denisko, Вы писали:
D>Народ а есть где нибудь в недрах буста (или не буста) класс, который принимает на вход класс и если выполнены некоторые условия, вызывает у него определенную функцию. Самому написать не проблема, но лень. D>З.ы. не поверите в гугле таки забанили.
А чем не устраивает решение на макросе:
#include <iostream>
#define INVOKEFUN_C(COND, CLASS, FUNC, ...) if (COND) CLASS::FUNC(__VA_ARGS__);
#define INVOKEFUN_O(COND, OBJ, FUNC, ...) if (COND) OBJ.FUNC(__VA_ARGS__);
class A {
public:
static void sf(int x, int y){
std::cout << "sf(" << x << ", " << y << ")" << std::endl;
}
void f(int x, int y){
std::cout << "f(" << x << ", " << y << ")" << std::endl;
}
};
int main(void){
INVOKEFUN_C(true, A, sf, 1, 2);
A a;
INVOKEFUN_O(true, a, f, 3, 4);
getchar();
return 0;
}
Здравствуйте, denisko, Вы писали:
D>Народ а есть где нибудь в недрах буста (или не буста) класс, который принимает на вход класс и если выполнены некоторые условия, вызывает у него определенную функцию. Самому написать не проблема, но лень. D>З.ы. не поверите в гугле таки забанили.
Здравствуйте, zaufi, Вы писали:
Z>Здравствуйте, denisko, Вы писали:
D>>Народ а есть где нибудь в недрах буста (или не буста) класс, который принимает на вход класс и если выполнены некоторые условия, вызывает у него определенную функцию. Самому написать не проблема, но лень. D>>З.ы. не поверите в гугле таки забанили.
Z>ты слишком специализированные вопросы задаешь... суда по оценкам народ просто растерялся не найдя что ответить %)
Да просто все, у нас есть товарищь, который ОООЧЕНЬ любит писать так
и гордится этим.
1) По ряду причин, мы не используем исключения (слишком много наследного кода, причем шаблонного, который не поддерживает исключения).
где SAFE_CALL -- ловит все разумные исключения товарища, пишет в лог и выставляет код ошибки. Как писать понятно, но писать нудно -- надо кучу операторов скобочка для каждого аргумента, да и наверняка это где то реализовано, вот такую реализацию я и ищу.
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, denisko, Вы писали:
D>>Народ а есть где нибудь в недрах буста (или не буста) класс, который принимает на вход класс и если выполнены некоторые условия, вызывает у него определенную функцию. Самому написать не проблема, но лень. D>>З.ы. не поверите в гугле таки забанили.
AG>Попробую угадать.
AG>boost::lambda::if_then
AG>http://www.boost.org/doc/libs/1_40_0/doc/html/lambda/le_in_details.html#lambda.lambda_expressions_for_control_structures
Вах ! Большое человеческое спасибо!
Методы социального рефакторинга не пробовали?
Или, например,
struct trap
{
// любой правоассоциативный оператор с низким приоритетомtemplate<class Exception> trap& operator <<= (Exception const& e)
{
handle_the_exception(e); // пишет в лог, взводит флаг, утилизирует объект (если надо)return *this;
}
// для возвращенияtemplate<class Return> operator Return() const { return Return(); }
};
#ifdef пожалеем_раздолбая
#define throw trap() <<= /*исключение*/#else
#define throw !!! по голове себе постучи !!!
#endif
D>1) По ряду причин, мы не используем исключения (слишком много наследного кода, причем шаблонного, который не поддерживает исключения).
D>Хочется иметь что-нибудь типа такой структуры D>где SAFE_CALL -- ловит все разумные исключения товарища, пишет в лог и выставляет код ошибки. Как писать понятно, но писать нудно -- надо кучу операторов скобочка для каждого аргумента, да и наверняка это где то реализовано, вот такую реализацию я и ищу.
Чтобы самому не заниматься с многоарными функциями, а сосредоточиться только на сути — задействуй boost::bind
Что-нибудь в таком роде:
template<class F>
typename boost::result_type<F>::type
safecall(F f)
{
try
{
return f();
}
catch(...)
{
rethrow_handle_and_absorb();
return default_value();
}
}
// обработчик исключений, вынесенный за пределы вызова проблемного кодаvoid rethrow_handle_and_absorb
{
try { throw; } // переизлучаем... но мы должны быть уверены, что вызвали эту функцию из catch(...)catch(aaa) { .... }
catch(bbb) { .... }
catch(ccc) { .... }
catch(...) { .... }
}
// универсальный результат - приводится ко всем типам на светеstruct default_value
{
template<class T> operator T() const { return T(); }
};
// вызываем
.... safecall(boost::bind(foo,1,2,3,4,5)) .....
А если хочешь биндить этот safecall, то
// карринг параметров шаблона: возвращаемый тип R отдельно,template<class R> struct safecaller
{
typedef R result_type;
// а принимаемый F - отдельноtemplate<class F> R operator()(F f) const { return safecall(f); }
};
// используем...
bar( .....
bind(
safecaller<bool>(), // тип объекта и тип result_type для bind нужны сразу (он их замучается выводить)
protect( // изолируем внутренний бинд от внешнего
bind(foo,1,2,3,4,5)
) // то есть, внутрь safecall<bool>()(_) приедет не результат вызова foo(1,2,3,4,5), а сам бинд
)
.....
);
void bar(...., F f, .....) // F изоморфен bool(), т.е., например, function<void()> или параметр шаблона
{ ..... f(); ..... } // здесь f() тождественно предыдущей форме safecall(bind(foo,1,2,3,4,5))