функция, возвращающуя указатель на функцию, возвращающая ..
От: warobushek  
Дата: 24.08.08 05:46
Оценка:
Из http://faqs.org.ru/progr/c_cpp/cfaqrus4.htm

10.5 Я моделирую Марковский процесс с конечным числом состояний, и у меня
есть набор функций для каждого состояния. Я хочу, чтобы смена
состояний происходила путем возврата функцией указателя на функцию,
соответветствующую следующему состоянию. Однако, я обнаружил
ограничение в механизме деклараций языка С: нет возможности объявить
функцию, возвращающую указатель на функцию, возвращающую указатель
на функцию, возвращающую указатель на функцию...

О: Да, непосредственно это сделать нельзя. Пусть функция возвращает
обобщенный указатель на функцию, к которому перед вызовом функции
будет применен оператор приведения типа, или пусть она возвращает
структуру, содержащую только указатель на функцию, возвращающую
эту структуру.


Уважаемые профессионалы, приведите пожалуйста пример такого приведения типа.
Re: функция, возвращающуя указатель на функцию, возвращающая
От: Аноним  
Дата: 24.08.08 08:19
Оценка:
W>Уважаемые профессионалы, приведите пожалуйста пример такого приведения типа.

ну, например так ?

#include <iostream>

struct Next {
   Next(Next (*p)()) : fun(p){}
   Next (*fun)();
};

Next fun1()
{
  std::cout<<"fun1()\n";
  Next fun2();
  return Next(fun2);
}

Next fun2()
{
  std::cout<<"fun2()\n";
  Next fun3();
  return Next(fun3);
}

Next fun3()
{
   std::cout<<"fun3(), final state\n";
   return Next(0);
}

int main()
{
  Next state(fun1);
  while(state.fun) {
     state = state.fun();
  }
}


или тебе касты нужны обязательно?

typedef void (*generic)();

generic fun1()
{
   generic fun2();
   std::cout<<"fun1\n";
   return reinterpret_cast<generic>(fun2);
}

generic fun2()
{
   generic fun3();
   std::cout<<"fun2\n";
   return reinterpret_cast<generic>(fun3);
}

generic fun3()
{
   std::cout<<"fun3, final state\n";
   return 0;
}

int main()
{
   generic state = reinterpret_cast<generic>(fun1);
   while (state) {
      state = reinterpret_cast<generic (*)()>(state)();
   }
}


Но это, конечно, ужас кромешный и ночной кошмар. Нафиг такие касты.
Re: функция, возвращающуя указатель на функцию, возвращающая
От: rg45 СССР  
Дата: 24.08.08 14:28
Оценка: +1
Здравствуйте, warobushek, Вы писали:

W>Из http://faqs.org.ru/progr/c_cpp/cfaqrus4.htm

W>

W>10.5 Я моделирую Марковский процесс с конечным числом состояний, и у меня
W> есть набор функций для каждого состояния. Я хочу, чтобы смена
W> состояний происходила путем возврата функцией указателя на функцию,
W> соответветствующую следующему состоянию. Однако, я обнаружил
W> ограничение в механизме деклараций языка С: нет возможности объявить
W> функцию, возвращающую указатель на функцию, возвращающую указатель
W> на функцию, возвращающую указатель на функцию...

W>О: Да, непосредственно это сделать нельзя. Пусть функция возвращает
W> обобщенный указатель на функцию, к которому перед вызовом функции
W> будет применен оператор приведения типа, или пусть она возвращает
W> структуру, содержащую только указатель на функцию, возвращающую
W> эту структуру.


W>Уважаемые профессионалы, приведите пожалуйста пример такого приведения типа.


Идея достаточно проста:
struct Result;
typedef Result F();

struct Result
{
  operator F*() const;
};

Result foo();

int main()
{
  F* f = foo(); 
  for(;;)
    f = f();
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: функция, возвращающуя указатель на функцию, возвращаю
От: warobushek  
Дата: 24.08.08 16:01
Оценка:
Здравствуйте, rg45, Вы писали:

R>Идея достаточно проста:


1.Я СИ++ еще толком не знаю, поясните манипуляции со словом operator, происходит глобальное переопределение оператора * ?

2.А строка
typedef Result F();

вводит тип "указатель на функцию, возвращающую значение типа Result" ?
Re[2]: функция, возвращающуя указатель на функцию, возвращаю
От: warobushek  
Дата: 24.08.08 16:06
Оценка:
Здравствуйте, Аноним,
С си++ только познакомился, поясните пожалуйста некоторые моменты

Что означает вот эта строка?
Next(Next (*p)()) : fun(p){}


Как работает эта строка? (ясно, что возвращается указатель, но каким образом)
return Next(fun2);


В этом участке std зачем? Что это означает?
std::cout
Re[3]: функция, возвращающуя указатель на функцию, возвращаю
От: Аноним  
Дата: 24.08.08 16:28
Оценка:
W>С си++ только познакомился, поясните пожалуйста некоторые моменты

W>Что означает вот эта строка?

W>
W>Next(Next (*p)()) : fun(p){}
W>


Это конструктор. Он принимает указатель на функцию (выделен жирным) и инициализирует им член-указатель на функцию.
Я его определил, чтобы было удобнее возвращать объект типа Next из функции и инициализировать его сразу в одном выражении

return Next(fun2);


W>Как работает эта строка? (ясно, что возвращается указатель, но каким образом)

W>
W>return Next(fun2);
W>


А возвращается из функции не указатель непосредственно, а объект имеющий тип Next (в скобочках его конструктору как раз передается указатель на функцию fun2).

W>В этом участке std зачем? Что это означает?

W>
W>std::cout
W>


Это тебе надо про пространства имен почитать.
Re[2]: функция, возвращающуя указатель на функцию, возвращаю
От: Аноним  
Дата: 24.08.08 16:39
Оценка:
Вот вариант без конструкторов и на С.

#include <stdio.h>

struct Next {
   struct Next (*fun)();
};

struct Next fun1()
{
  printf("fun1()\n");
  struct Next fun2();
  struct Next retVal = {fun2};
  return retVal;
}

struct Next fun2()
{
  printf("fun2()\n");
  struct Next fun3();
  struct Next retVal = {fun3};
  return retVal;
}

struct Next fun3()
{
   printf("fun3(), final state\n");
   struct Next retVal = {0};
   return retVal;
}

int main()
{
  struct Next state = {fun1};
  while(state.fun) {
     state = state.fun();
  }
}


Впрочем, на С и без конструкторов неплохо :
#include <stdio.h>

typedef struct Next_ {
   struct Next_ (*fun)();
} Next;

Next fun1()
{
  printf("fun1()\n");
  Next fun2();
  return (Next){fun2};
}

Next fun2()
{
  printf("fun2()\n");
  Next fun3();
  return (Next){fun3};
}

Next fun3()
{
  printf("fun3(), final state\n");
  return (Next){0};
}

int main()
{
  Next state = {fun1};
  while(state.fun) {
     state = state.fun();
  }
}
Re[3]: функция, возвращающуя указатель на функцию, возвращаю
От: rg45 СССР  
Дата: 24.08.08 16:39
Оценка: 3 (1) +1
Здравствуйте, warobushek, Вы писали:

Отвечать удобнее в обратном порядке:

W>2.А строка

W>
W>typedef Result F();
W>

W>вводит тип "указатель на функцию, возвращающую значение типа Result" ?

Не совсем. Этот тип — не указатель, а "функция, возвращающая значение типа Result". Указатель получается из этого типа добавлением символа "звездочка": F*

W>1.поясните манипуляции со словом operator, происходит глобальное переопределение оператора * ?


Нет, строчка: operator F*() const; объявляет оператор приведения (неявного) типа Result к "указателю на функцию, возвращающую значение типа Result".

Вобщем, мы действительно не можем определить "функцию, возвращающую указатель на функцию, возвращающую указатель на функцию, возвращающую указатель на функцию..." Вместо этого мы определяем функцию, возвращающую тип, автоматически приводимый к указателю на функцию с такой же сигнатурой и получем в точке применения результат очень близкий к требуемому.
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.