Либо я найду путь, либо проложу его. © Свифт
Здравствуйте, Олег Гашев, Вы писали:
ОГ>В рецензии на книгу СаттераАвтор(ы): Герб Саттер
В данном издании объединены две широко известные профессионалам в области
программирования на C++ книги Герба Саттера Exceptional C++
и More Exceptional C++, входящие в серию книг C++ In-Depth,
редактором которой является Бьерн Страуструп, создатель языка C++.
Материал этой книги составляют переработанные задачи серии Guru of the Week,
рассчитанные на читателя с достаточно глубоким знанием C++.
Однако книга будет полезна каждому, кто хочет углубить свои знания в этой
области.
была приведена задача: "Можете ли Вы написать функцию, возвращающую указатель на саму себя? Если да, то для чего это может понадобиться?"
Кошка, которая гуляла сама по себеАвтор: Кодт
Дата: 03.10.03
...
ОГ>Что-то у меня очень просто получается:
У тебя хак, основанный на предположении, что можно сконвертировать указатель на данные — void* — в указатель на функцию — void*(*)().
Это — отступление от Стандарта, для платформ, на которых размер и структура указателей на данные и на функции совпадают.
Пример, где фокус не пройдёт: 8086, модель памяти compact (короткий указатель на данные, длинный на код).
На самом деле, можно возвращать void(*)(), поскольку все указатели на функции приводятся к нему и обратно.
Тем не менее, вызов такой функции будет обременён c-style-cast'ом
typedef void(*pfun)();
typedef pfun(*pmoebius)(int i);
pfun moebius() { print("run! %i\n", i); return moebius; }
main()
{
pmoebius p = moebius;
for(int i=0; i<10; ++i)
p = (pmoebius)(p(i));
}
Здравствуйте, Олег Гашев, Вы писали:
ОГ>Что-то у меня очень просто получается:
ОГ>ОГ>typedef void* (*FUN)();
ОГ>
ОГ>Правильный ответ на вопрос пока не знаю... Подскажите.
Неправильно, поскольку тип указателя не совпадает с типом указатель на функцию. Правильный ответ заключается в том, что нужно возвратить объект, который содержит оператор приведения к типу фукнции:
struct Fun;
typedef Fun (FunPtr*)();
struct Fun
{
Fun(FunPtr p) : ptr(p) {}
operator FunPtr() const { return ptr; }
FunPtr ptr;
};
Fun a()
{
return &a;
}
// а можно использовать так
Fun b();
Fun c();
Fun f=&a;
while(не_надоест)
{
f=f();
}
Но лучше всего прочитать книгу.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>