[Boost.Bind] Как вернуть результат of bind?
От: igna Россия  
Дата: 15.08.09 14:33
Оценка:
Сложное bind-выражение встречается несколько раз, поэтому определил макрос. Что-то вроде:

#define IS_NAME(name) (bind(...(name)...))


Попробовал заменить макрос функцией возвращающей boost::function, но тогда нельзя писать так:

    IS_NAME("aaa") || IS_NAME("bbb")


Так и оставить макрос?
Re: [Boost.Bind] Как вернуть результат of bind?
От: Alexander G Украина  
Дата: 15.08.09 15:19
Оценка: 6 (1)
Здравствуйте, igna, Вы писали:

I>Сложное bind-выражение встречается несколько раз, поэтому определил макрос. Что-то вроде:


I>
I>#define IS_NAME(name) (bind(...(name)...))
I>


I>Попробовал заменить макрос функцией возвращающей boost::function, но тогда нельзя писать так:


I>
I>    IS_NAME("aaa") || IS_NAME("bbb")
I>


I>Так и оставить макрос?


struct is_name
  : std::unary_function<const char*,bool>
{
  bool operator()(const char* s) const { ...}
  is_name operator||(const is_name& rhs) const { ...}
}

— не?
Русский военный корабль идёт ко дну!
Re[2]: [Boost.Bind] Как вернуть результат of bind?
От: igna Россия  
Дата: 15.08.09 16:35
Оценка:
AG>struct is_name
AG>  : std::unary_function<const char*,bool>
AG>{
AG>  bool operator()(const char* s) const { ...}
AG>  is_name operator||(const is_name& rhs) const { ...}
AG>}

AG> — не?

Спасибо, в понедельник попробую.
Re[2]: [Boost.Bind] Как вернуть результат of bind?
От: igna Россия  
Дата: 17.08.09 10:39
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>struct is_name
AG>  : std::unary_function<const char*,bool>
AG>{
AG>  bool operator()(const char* s) const { ...}
AG>  is_name operator||(const is_name& rhs) const { ...}
AG>}


Еще раз спасибо за идею перегрузить operator||. Правда я перегрузил его по другому:

template <class T>
function<bool (T)> operator||(
    function<bool (T)> lhs,
    function<bool (T)> rhs)
{
    return bind(lhs, _1) || bind(rhs, _1);
}


IMHO эта и аналогичные ей перегрузки (для других операторов и других количеств параметров) должны бы определяться в Boost.Function, это ее дело, не мое как пользователя.
Re[3]: [Boost.Bind] Как вернуть результат of bind?
От: Alexander G Украина  
Дата: 17.08.09 10:52
Оценка:
Здравствуйте, igna, Вы писали:

I>IMHO эта и аналогичные ей перегрузки (для других операторов и других количеств параметров) должны бы определяться в Boost.Function, это ее дело, не мое как пользователя.


Сейчас у такого кода имеется такая же семантика, как с указателями на функции:


boost::function<R(P)> a, b;
if (a || b)
{
  ...
}

При переопределении || смысл уже неочевиден.

Кроме того, неясно, насколько лениво в f = (a || b); f() делать проверку b на NULL — кидать сразу, при попытке вызова f() или только если a вернула false.
Русский военный корабль идёт ко дну!
Re[4]: [Boost.Bind] Как вернуть результат of bind?
От: igna Россия  
Дата: 17.08.09 11:02
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Кроме того, неясно, насколько лениво в f = (a || b); f() делать проверку b на NULL — кидать сразу, при попытке вызова f() или только если a вернула false.


Нинасколько не лениво, так же как и в случае перегрузки, которую определяют Boost.Bind и Boost.Lambda. Ленивый operator|| определить нельзя.
Re[5]: [Boost.Bind] Как вернуть результат of bind?
От: Alexander G Украина  
Дата: 17.08.09 11:13
Оценка: 2 (1)
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Alexander G, Вы писали:


AG>>Кроме того, неясно, насколько лениво в f = (a || b); f() делать проверку b на NULL — кидать сразу, при попытке вызова f() или только если a вернула false.


I>Нинасколько не лениво, так же как и в случае перегрузки, которую определяют Boost.Bind и Boost.Lambda. Ленивый operator|| определить нельзя.


Если оставить без дополнительной проверки, то будет "лениво", в смысле

bool x() { ... }
...
boost::function<bool()> a = x;
boost::function<bool()> b = 0;
boost::function<bool()> p = a || b; // не кидает
boost::function<bool()> r = b || a; // не кидает
if (p) // true
{
  p(); // кидает, если x возвращает false
}
if (r) // true
{
  r(); // всегда кидает
}
Русский военный корабль идёт ко дну!
Re[4]: [Boost.Bind] Как вернуть результат of bind?
От: Alexander G Украина  
Дата: 17.08.09 11:25
Оценка: 2 (1)
Может, наследника от boost::function?
Срезка не опасна (данные не теряются), а сахар в виде lambda-way операторов будет явным.
template<class T>
class op_function : public function<T>
{
public:
  explicit op_function(function<T> const&);
  ...
}

template<class T>
op_function make_op(function<T> const&);

function<bool()> = make_op(a) || b;


А ещё, может реализовать только нужные операторы и оптимально, переписав внутренний бинд в то, что, что он реализует? Взять Boost.Proto и сделать expression template?
Русский военный корабль идёт ко дну!
Re[5]: [Boost.Bind] Как вернуть результат of bind?
От: igna Россия  
Дата: 17.08.09 12:53
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Может, наследника от boost::function?


Разумно, только в моем случае лучше уж пусть та самая возвращающая function функция (которую я сам пишу), возвращает op_function, тогда не нужен будет make_op в выражении.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.