Анонимные функции
От: R1  
Дата: 16.12.05 16:52
Оценка:
Появиться ли такая возможность, а может уже есть?

Или как еще сделать что-то подобное:

struct x {
 int (*f)();
} _x[]= {
 { puts("the anonymous function1"); },
 { puts("the anonymous function2"); }
};
Re: Анонимные функции
От: _nn_  
Дата: 16.12.05 17:28
Оценка:
Здравствуйте, R1, Вы писали:

R1>Появиться ли такая возможность, а может уже есть?


R1>Или как еще сделать что-то подобное:


R1>
R1>struct x {
R1> int (*f)();
R1>} _x[]= {
R1> { puts("the anonymous function1"); },
R1> { puts("the anonymous function2"); }
R1>};
R1>


На данный момент заменителями этой вещи существуют : boost::bind/boost::lambda, локальные классы.
Вы лучше скажите где вам это понадобилось, а там найдется подходящее решение
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Анонимные функции
От: R1  
Дата: 16.12.05 17:29
Оценка:
есть конечно жесткий вариант, но както не подходит


#include <cstdio>

typedef int (*fint_t)();

int
main()
{
 fint_t anon = (fint_t)(char*)"\x31\xC0\xC3"; // return(0);
 return(anon());
}
Re[2]: Анонимные функции
От: R1  
Дата: 16.12.05 17:55
Оценка:
Здравствуйте, _nn_, Вы писали:

__>На данный момент заменителями этой вещи существуют : boost::bind/boost::lambda, локальные классы.

__>Вы лучше скажите где вам это понадобилось, а там найдется подходящее решение

1) очень удобно использовать при автогенерации кода.

2) пишу библиотеку где возможность обьявлять функции "неотходя от кассы " внесет ясность и практичность, о как. Вообщем, чтобы действие и реакция на действие находились в одном месте, а обьявлять функцию где-то, а потом использовть указатель неочень удобно и не наглядно, причем этих функций достаточно много.
Какроче как в генераторах типа yacc,flex,...

/* приметно так */
typedef int (*fint_t)();
typedef struct x_t {
 char * expr;
 fint_t fn_accept;
} x_t;

// где-то в программе
x_t x = 
{
 "\d+",
 { return(replace_allowed? true:false); }
};

char * result = replace(x, string_for_replace); // заменить с учетом контекста
Re[3]: Анонимные функции
От: _nn_  
Дата: 16.12.05 18:50
Оценка:
Здравствуйте, R1, Вы писали:

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


__>>На данный момент заменителями этой вещи существуют : boost::bind/boost::lambda, локальные классы.

__>>Вы лучше скажите где вам это понадобилось, а там найдется подходящее решение

R1>1) очень удобно использовать при автогенерации кода.


R1>2) пишу библиотеку где возможность обьявлять функции "неотходя от кассы " внесет ясность и практичность, о как. Вообщем, чтобы действие и реакция на действие находились в одном месте, а обьявлять функцию где-то, а потом использовть указатель неочень удобно и не наглядно, причем этих функций достаточно много.

R1>Какроче как в генераторах типа yacc,flex,...

R1>
R1>/* приметно так */
R1>typedef int (*fint_t)();
R1>typedef struct x_t {
R1> char * expr;
R1> fint_t fn_accept;
R1>} x_t;

R1>// где-то в программе
R1>x_t x = 
R1>{
R1> "\d+",
R1> { return(replace_allowed? true:false); }
R1>};

R1>char * result = replace(x, string_for_replace); // заменить с учетом контекста
R1>


Локальные классы не спасут ?
void f()
{
 class a_
 {
 public:
  operator()(int i)
  {
   cout << i;
  }
 }a;

 a(1);
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Анонимные функции
От: Valodzka Беларусь  
Дата: 17.12.05 00:27
Оценка:
Здравствуйте, R1, Вы писали:

R1>есть конечно жесткий вариант, но както не подходит



R1>
R1>#include <cstdio>

R1>typedef int (*fint_t)();

R1>int
R1>main()
R1>{
R1> fint_t anon = (fint_t)(char*)"\x31\xC0\xC3"; // return(0);
R1> return(anon());
R1>}
R1>

Не перебивайте меня, когда я вас перебиваю
Re[4]: Анонимные функции
От: R1  
Дата: 17.12.05 14:49
Оценка:
__>Локальные классы не спасут ?
__>
__>void f()
__>{
__> class a_
__> {
__> public:
__>  operator()(int i)
__>  {
__>   cout << i;
__>  }
__> }a;

__> a(1);
__>}
__>


Выглядет немного некрасиво но уже что-то
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.