Re: boost::labfa::_1 & boost::shared_ptr
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 12.10.04 11:31
Оценка: 25 (4)
Здравствуйте, Garrrrr, Вы писали:

G>Так и должно быть или все таки сам? точнее если возможно — можно это заставить заработать?


Вот, напильник для тех у кого не "свежий" бюст:
#include <boost/shared_ptr.hpp>
#include <boost/lambda/lambda.hpp>

// собственно напильник

namespace boost
{
namespace lambda
{

template<class T>
struct plain_return_type_1<other_action<contentsof_action>, shared_ptr<T> > 
{
    typedef T &type;
};

}
}

// проверка

#include <iostream>
#include <vector>
#include <algorithm>


int main()
{
    using namespace boost::lambda;
    std::vector<boost::shared_ptr<int> > v;
    //std::vector<int *> v;
    std::for_each(v.begin(), v.end(), std::cout << *_1);
    return 0;
}


Можно определить также для других умных указателей, в том числе для своих, и не только для операции *. См. http://www.boost.org/libs/lambda/doc/ar01s06.html.

PS. В документации ошибка, contents_of_action нужно читать как contentsof_action (по крайней мере для Boost 1.31.0).
getboost.codeplex.com
citylizard.codeplex.com
Re[3]: boost::labfa::_1 & boost::shared_ptr
От: MaximE Великобритания  
Дата: 12.10.04 09:03
Оценка: 6 (1)
sergey_shandar wrote:

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

>
> ME>Приведи диагностику компилятора.
>
> Вероятно 'iterator_category' : is not a member of 'boost::shared_ptr<T>'.

Наверное boost древний стоит.

Я скомпилил со свежим бустом на VC7.1 — все Ok.

Свежий буст можно взять из CVS или по http ежечасный CVS tarball.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[2]: boost::labfa::_1 & boost::shared_ptr
От: korzhik Россия  
Дата: 12.10.04 11:43
Оценка: :)
Здравствуйте, sergey_shandar, Вы писали:

Сергей, у вас "дьявольское" число в общем числе сообщений в профайле, поэтому срочно чего нибудь сюда напишите, пока что нибудь не случилось
Re[5]: boost::labfa::_1 & boost::shared_ptr
От: MaximE Великобритания  
Дата: 13.10.04 06:08
Оценка: :)
sergey_shandar wrote:

> ME>Наверное boost древний стоит.

> Извини, Максим, но свежее 1.31.0 стабильного релиза на 12/10/2004 я не знаю.

Мне тут подумалось, что за такие слова в comp.lang.c++.moderated или в gmane.comp.lib.boost.devel тебя бы точно назвали fudster'ом (от слова FUD), за внушение страха и неуверенности в отношении boost'a.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
boost::labfa::_1 & boost::shared_ptr
От: Garrrrr  
Дата: 12.10.04 08:08
Оценка:
Не компилируется на gcc-2.95 такая конструкция:
vector<boost::shared_ptr<int> > v;
for_each(v.begin(), v.end(), cout << *(_1));
Так и должно быть или все таки сам? точнее если возможно — можно это заставить заработать?
Re: boost::labfa::_1 & boost::shared_ptr
От: jazzer Россия Skype: enerjazzer
Дата: 12.10.04 08:18
Оценка:
Здравствуйте, Garrrrr, Вы писали:

G>Не компилируется на gcc-2.95 такая конструкция:

G> vector<boost::shared_ptr<int> > v;
G> for_each(v.begin(), v.end(), cout << *(_1));
G>Так и должно быть или все таки сам? точнее если возможно — можно это заставить заработать?

а если без скобок, просто *_1?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: boost::labfa::_1 & boost::shared_ptr
От: Garrrrr  
Дата: 12.10.04 08:26
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Garrrrr, Вы писали:


G>>Не компилируется на gcc-2.95 такая конструкция:

G>> vector<boost::shared_ptr<int> > v;
G>> for_each(v.begin(), v.end(), cout << *(_1));
G>>Так и должно быть или все таки сам? точнее если возможно — можно это заставить заработать?

J>а если без скобок, просто *_1?

Да без разницы... получается, что невозможно использовать _1 для смарт-пойнтеров?
Re: boost::labfa::_1 & boost::shared_ptr
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 12.10.04 08:37
Оценка:
Здравствуйте, Garrrrr, Вы писали:

G>Не компилируется на gcc-2.95 такая конструкция:

G> vector<boost::shared_ptr<int> > v;
G> for_each(v.begin(), v.end(), cout << *(_1));
G>Так и должно быть или все таки сам? точнее если возможно — можно это заставить заработать?

Вот так надо:
for_each(v.begin(), v.end(), (cout << bind(&shared_ptr<int>::operator *, _1)));
"Что не завершено, не сделано вовсе" Гаусс
Re: boost::labfa::_1 & boost::shared_ptr
От: MaximE Великобритания  
Дата: 12.10.04 08:40
Оценка:
Garrrrr wrote:

> Не компилируется на gcc-2.95 такая конструкция:

> vector<boost::shared_ptr<int> > v;
> for_each(v.begin(), v.end(), cout << *(_1));
> Так и должно быть или все таки сам? точнее если возможно — можно это заставить заработать?

Приведи диагностику компилятора.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[2]: boost::labfa::_1 & boost::shared_ptr
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 12.10.04 08:56
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Приведи диагностику компилятора.


Вероятно 'iterator_category' : is not a member of 'boost::shared_ptr<T>'.
getboost.codeplex.com
citylizard.codeplex.com
Re[4]: boost::labfa::_1 & boost::shared_ptr
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 12.10.04 10:24
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Наверное boost древний стоит.

Извини, Максим, но свежее 1.31.0 стабильного релиза на 12/10/2004 я не знаю. . Но спасибо за обнадеживающую информацию, что, вероятно, проблемы с *_1 будут в следующем релизе исправленны. А пока будем обрабатывать напильником до нужной формы.
getboost.codeplex.com
citylizard.codeplex.com
Re[5]: boost::labfa::_1 & boost::shared_ptr
От: MaximE Великобритания  
Дата: 12.10.04 10:33
Оценка:
sergey_shandar wrote:

> ME>Наверное boost древний стоит.

> Извини, Максим, но свежее 1.31.0 стабильного релиза на 12/10/2004 я не знаю.

С релизом 1.31.0 у них комом вышло. Лично я пользуюсь в продакшене бустом из CVS — никаких проблем не было.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[4]: boost::labfa::_1 & boost::shared_ptr
От: Garrrrr  
Дата: 12.10.04 11:39
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>sergey_shandar wrote:


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

>>
>> ME>Приведи диагностику компилятора.
>>
>> Вероятно 'iterator_category' : is not a member of 'boost::shared_ptr<T>'.

ME>Наверное boost древний стоит.


ME>Я скомпилил со свежим бустом на VC7.1 — все Ok.


ME>Свежий буст можно взять из CVS или по http ежечасный CVS tarball.


ME>--

ME>Maxim Yegorushkin
boost 1.30.1 gcc-2.95
Соотвественно версии бибилиотек и компилятора неизменны....
Re[3]: boost::labfa::_1 & boost::shared_ptr
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 12.10.04 13:06
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, sergey_shandar, Вы писали:


K>Сергей, у вас "дьявольское" число в общем числе сообщений в профайле, поэтому срочно чего нибудь сюда напишите, пока что нибудь не случилось


Ok. Еще один напильник, для оператора ->*. Но документации не нашел, поэтому, возможно, что все можно сделать проще или правильнее.
#include <boost/shared_ptr.hpp>
#include <boost/lambda/lambda.hpp>

namespace boost
{

namespace lambda
{

template<class T>
struct plain_return_type_1<other_action<contentsof_action>, shared_ptr<T> > 
{
    typedef T &type;
};

/// Тип возврата оператора ->*.
template<class A, class B>
struct return_type_2<other_action<member_pointer_action>, shared_ptr<A>, B>:
    return_type_2<other_action<member_pointer_action>, A *, B>
{
};

/// Странный оператор ->* для shared_ptr.
/// Работает только в пространстве boost::lambda.
template<class T, class F>
typename lambda::return_type_2<lambda::other_action<lambda::member_pointer_action>, T *, F>::type
operator->*(const shared_ptr<T> &a, F f)
{
    T *p = a.get();
    return (lambda::_1 ->* f)(p);
}

}
}

// проверка

#include <iostream>
#include <vector>
#include <algorithm>

struct A
{
public:
    int f;
    void F() { std::cout << "Elki"; }
};

int main()
{
    using namespace boost::lambda;
    std::vector<boost::shared_ptr<int> > v;
    v.push_back(boost::shared_ptr<int>(new int(1)));
    //std::vector<int *> v;
    std::for_each(v.begin(), v.end(), std::cout << *_1);
    std::vector<boost::shared_ptr<A> > a;
    a.push_back(boost::shared_ptr<A>(new A()));
    (a[0] ->* &A::F)(); /// проверка странного оператора boost::lambda::->*
    //std::vector<A *> a;
    std::for_each(a.begin(), a.end(), _1 ->* &A::F);
    std::for_each(a.begin(), a.end(), (_1 ->* &A::f) = 1);
    return 0;
}
getboost.codeplex.com
citylizard.codeplex.com
Re[4]: boost::labfa::_1 & boost::shared_ptr
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 12.10.04 13:20
Оценка:
Здравствуйте, sergey_shandar, Вы писали:

_>Ok. Еще один напильник, для оператора ->*. Но документации не нашел, поэтому, возможно, что все можно сделать проще или правильнее.


Простите, это я поспешил. Конечно же здесь серьезная ошибка
template<class T, class F>
typename lambda::return_type_2<lambda::other_action<lambda::member_pointer_action>, T *, F>::type
operator->*(const shared_ptr<T> &a, F f)
{
    T *p = a.get();
    return (lambda::_1 ->* f)(p);
}


Нужно так:
template<class T, class F>
typename return_type_2<other_action<member_pointer_action>, T *, F>::type
    operator->*(const shared_ptr<T> &a, F f)
{
    return ((&_1) ->* f)(*a);
}


Может еще кто увидит ляпы?
getboost.codeplex.com
citylizard.codeplex.com
Re[6]: boost::labfa::_1 & boost::shared_ptr
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 13.10.04 06:31
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Мне тут подумалось, что за такие слова в comp.lang.c++.moderated или в gmane.comp.lib.boost.devel тебя бы точно назвали fudster'ом (от слова FUD), за внушение страха и неуверенности в отношении boost'a.


Страх и не уверенность обычно порождения недостатка информации. Я сказал именно это "свежее 1.31.0 стабильного релиза на 12/10/2004 я не знаю.". Если где то есть стабильный релиз, то я его не видел. CVS версию я не называю стабильным релизом и в своем проекте, на работе, использовать вряд ли буду. Поиграться можно с ним, но не более. Если им так угодно, пусть называют fudsterом, релиза более свежего релиза я все равно не вижу
getboost.codeplex.com
citylizard.codeplex.com
Re[7]: boost::labfa::_1 & boost::shared_ptr
От: MaximE Великобритания  
Дата: 13.10.04 06:52
Оценка:
sergey_shandar wrote:

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

>
> ME>Мне тут подумалось, что за такие слова в comp.lang.c++.moderated или в gmane.comp.lib.boost.devel тебя бы точно назвали fudster'ом (от слова FUD), за внушение страха и неуверенности в отношении boost'a.
>
> Страх и не уверенность обычно порождения недостатка информации. Я сказал именно это "свежее 1.31.0 стабильного релиза на 12/10/2004 я не знаю.". Если где то есть стабильный релиз, то я его не видел. CVS версию я не называю стабильным релизом и в своем проекте, на работе, использовать вряд ли буду. Поиграться можно с ним, но не более. Если им так угодно, пусть называют fudsterом, релиза более свежего релиза я все равно не вижу

На CVS версии несколько раз в день гоняются регрешшены, поэтому, чтобы не назвать CVS версию стабильной или назвать нестабильной нужны веские основания. Это моё имхо, и я всегда буду пользовать свежак из CVS.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.