Вот, раскопал в бусте
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 11.02.04 14:53
Оценка: 32 (4)
Не знаю точно, куда это помещать, в с++ или исходники. Поэтому сделаю упор
на с++ приемчик оттуда и да простит меня модератор, если я не прав.
http://lists.boost.org/MailArchives/boost/msg60050.php

Все в порядке: тема как раз для этого форума. -- ПК.

--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re: Вот, раскопал в бусте
От: ioni Россия  
Дата: 11.02.04 18:51
Оценка:
Здравствуйте, alnsn, Вы писали:

A>Не знаю точно, куда это помещать, в с++ или исходники. Поэтому сделаю упор

A>на с++ приемчик оттуда и да простит меня модератор, если я не прав.
A>http://lists.boost.org/MailArchives/boost/msg60050.php


во первых

template<class T>
struct handler_impl : handler
{
    handlers_t::iterator try_(
        boost::function0<void> const& fn
      , handlers_t::iterator iter
      , handlers_t::iterator end)
    {
        try
        {
            if (iter == (end - 1))
            {
                fn();
            }
            else
            {
                handlers_t::iterator next(iter); ++next;
                return (*next)->try_(fn, next, end);
            }
        }
        catch (T const*)
        {
            return iter;
        }

            return iter;

    }



и потом у меня он не линкуется
error LNK2019: unresolved external symbol "void __cdecl boost::throw_exception(class exception const &)" (?throw_exception@boost@@YAXABVexception@@@Z) referenced in function "public: void __thiscall boost::function0<void,class std::allocator<class boost::function_base> >::operator()(void)const " (??R?$function0@XV?$allocator@Vfunction_base@boost@@@std@@@boost@@QBEXXZ)
Re[2]: Вот, раскопал в бусте
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 11.02.04 21:02
Оценка:
ioni wrote:

> и потом у меня он не линкуется

> error LNK2019: unresolved external symbol "void __cdecl
> boost::throw_exception(class exception const &)"
Скорее всего ты используешь официальный буст, а тот парень sandbox, поэтому
и непонятки. Допиши в конце файла
vod throw_exception(class exception const & ex)
{
    throw ex;
}

--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re: Вот, раскопал в бусте
От: konst  
Дата: 12.02.04 06:33
Оценка:
в двух словах можно объяснить, зачем это?
Re[2]: Вот, раскопал в бусте
От: Аноним  
Дата: 12.02.04 10:43
Оценка:
Здравствуйте, ioni, Вы писали:

......

I>и потом у меня он не линкуется

I>error LNK2019: unresolved external symbol "void __cdecl boost::throw_exception(class exception const &)" (?throw_exception@boost@@YAXABVexception@@@Z) referenced in function "public: void __thiscall boost::function0<void,class std::allocator<class boost::function_base> >::operator()(void)const " (??R?$function0@XV?$allocator@Vfunction_base@boost@@@std@@@boost@@QBEXXZ)

Небольшая обработка, чтобы убрать бустовые навороты (извиняюсь за длинный код):

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

struct base {};
struct A : base {};
struct B : A {};
struct C : B {};


struct handler;

typedef std::vector<handler*> handlers_t;

struct throw__
{
    virtual void Tr() const =0;
};

struct handler
{
    virtual handlers_t::iterator try_(
        throw__ * fn
      , handlers_t::iterator iter
      , handlers_t::iterator end
    ) = 0;

    virtual void print_type() const = 0;
};

template<class T>
struct handler_impl : handler
{
    handlers_t::iterator try_(
        throw__ * fn
      , handlers_t::iterator iter
      , handlers_t::iterator end)
    {
        try
        {
            if (iter == (end - 1))
            {
                fn->Tr();
            }
            else
            {
                handlers_t::iterator next(iter); ++next;
                return (*next)->try_(fn, next, end);
            }
        }
        catch (T const*)
        {
            return iter;
        }
    }

    void print_type() const
    {
        std::cout << typeid(T).name() << "\n";
    }
};


template<class T>
struct throw_: public throw__
{
    virtual void Tr() const
    {
        T* p(0);
        throw p;
    }
};

handlers_t& handlers()
{
    static handlers_t h;
    return h;
}

template<class T>
void register_()
{
    handlers_t::iterator iter = handlers().end();

    if (handlers().empty())
    {
        handlers().push_back(new handler_impl<T>);
        return;
    }

    try
    {
        throw_<T> * temp=new throw_<T>();
        iter = handlers()[0]->try_(temp, handlers().begin(), handlers().end());
        handlers().insert(iter + 1, new handler_impl<T>);
        delete temp;
    }
    catch (T const*)
    {
        handlers().insert(handlers().begin(), new handler_impl<T>);
    }
}

void print_type(handler * t)
{
    t->print_type();
}

int main()
{
    register_<C>();
    register_<A>();
    register_<B>();
    register_<base>();

    std::cout << "-- order -----------------------------\n";

    std::for_each(
        handlers().begin()
      , handlers().end()
      , print_type
    );
}


2 konst:
Этот метод наглядно показывает, что в программе сохраняется информация о наследствовании классов. Каждый новый добавляемый
класс проходит через операторы try/throw/catch для всех зарегистрированых ранее типов.
try
{
...
T* p(0);
throw p; // попытка "выбросить" экземпляр проверяемого..
}
catch (T const *) // тут T - зарегистрированый ранее класс, а не "выбрасываемый"
{
...
}

таким образом указатели на классы в векторе сортируются в порядке, соответствующем количеству предков.
Re[3]: Вот, раскопал в бусте
От: Гарбузенко Алексей Украина http://bast.kiev.ua
Дата: 12.02.04 11:08
Оценка:
....

почему-то, при отправке прошлого сообщения сбились cookies..
прошу прощения за "анонимность"..
"..ты только посмотри на это деградирующее новое поколение, — даже "Момент", который они нюхают придумали до них!" (с) ZerG
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.