Не знаю точно, куда это помещать, в с++ или исходники. Поэтому сделаю упор
на с++ приемчик оттуда и да простит меня модератор, если я не прав.
http://lists.boost.org/MailArchives/boost/msg60050.php
Все в порядке: тема как раз для этого форума. -- ПК.
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Здравствуйте, 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)
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
Здравствуйте, 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 - зарегистрированый ранее класс, а не "выбрасываемый"
{
...
}
таким образом указатели на классы в векторе сортируются в порядке, соответствующем количеству предков.
....
почему-то, при отправке прошлого сообщения сбились cookies..
прошу прощения за "анонимность"..
"..ты только посмотри на это деградирующее новое поколение, — даже "Момент", который они нюхают придумали до них!" (с) ZerG