Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генерирование функций, или привязывание параметров к функциям 
V
    Опции темы
Lipetsk
  Дата 3.11.2011, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



Здравствуйте
У меня возникла такая задача на C/C++. Нужно сделать что-то вроде генератора функций. Например, 
Код

//как сделать такую функцию
void* Generator(int arg);

//которая, будет создавать функции вида
int f(){
  int a=arg;  //Значение arg должно вставляться в функцию f как константа во время генерации этой функции генератором Generator
  return a;
}
//и возвращать указатель на нее

//В итоге должно получиться:
typedef int (*func) (void);

func f7=(func) Generator(7);
func f11=(func) Generator(11);

printf("%i",f7());  //выводит "7"
printf("%i",f11());  //выводит "11"


Наверняка для этого существуют какие-то стандартные подходы, но в интернете что-то ничего удовлетворительного не нашел

Спасибо
PM   Вверх
Earnest
Дата 3.11.2011, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Во-первых, это надо спрашивать в разделе С++
Во-вторых, можно как-то так:
Код

template <int _ARG>
int f()
{
  int a = _ARG;  
  return a;
}

Использование:
Код

printf("%i",f<7>());  // выводит "7"



--------------------
...
PM   Вверх
Lipetsk
  Дата 3.11.2011, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



на счет раздела, может я и ошибся

но ваш вариант реализации определенно не годится, нужно именно "генерировать" функции в real-time, а не при компиляции
нужно, чтобы функция f имела определенный тип, в примере это func, потому что это будет CallBack функция для API

Это сообщение отредактировал(а) Lipetsk - 3.11.2011, 08:17
PM   Вверх
Lipetsk
  Дата 3.11.2011, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



Если я ошибся разделом, то, пожалуйста, перенесите тему в раздел C/C++ Общие вопросы
PM   Вверх
Earnest
Дата 3.11.2011, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Lipetsk @  3.11.2011,  09:16 Найти цитируемый пост)
нужно именно "генерировать" функции в real-time,

С++ так не умеет. А что касается раздела, то это может сделать только его модератор.


--------------------
...
PM   Вверх
boostcoder
Дата 3.11.2011, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



как сказала Earnest, в с++ невозможно генерировать функции в run-time. но это собственно и не надо.
одно из решений:
Код

#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>

typedef boost::function<int()> func_sig;

int f(int arg = 0) {
   int a = arg;
   return a;
}

func_sig Generator(int arg) {
   return boost::bind(&f, arg);
}

int main() {
   func_sig f7= Generator(7);
   func_sig f11= Generator(11);
   
   std::cout << f7() << std::endl;
   std::cout << f11() << std::endl;
}

http://liveworkspace.org/code/3a57b623742d...f3c92ebca38b115
PM WWW   Вверх
Lipetsk
  Дата 3.11.2011, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



Цитата(boostcoder @  3.11.2011,  08:33 Найти цитируемый пост)
как сказала Earnest, в с++ невозможно генерировать функции в run-time. но это собственно и не надо.
одно из решений:

не подходит такое решение, т.к. тип функции f должен быть typedef int (*func) (void);
PM   Вверх
boostcoder
Дата 3.11.2011, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Lipetsk @  3.11.2011,  10:54 Найти цитируемый пост)
тип функции f должен быть typedef int (*func) (void);

обоснование, пожалуйста ;)
PM WWW   Вверх
Lipetsk
  Дата 3.11.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



Цитата(boostcoder @  3.11.2011,  09:03 Найти цитируемый пост)
обоснование, пожалуйста ;) 

я уже писал
Цитата(Lipetsk @  3.11.2011,  06:16 Найти цитируемый пост)
потому что это будет CallBack функция для API


PM   Вверх
Леопольд
Дата 3.11.2011, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Lipetsk @  3.11.2011,  11:16 Найти цитируемый пост)
потому что это будет CallBack функция для API
А чем предложенный вариант не подходит?
Код
typedef boost::function<int()> func;
Этот вариант работает не только с указателями на функции но и с функторами (boost::bind генерирует функторы из функций), например:
Код
void APIfunc(std::function<void()> callback);

class Functor
{
    void operator()() {}
};

void entry()
{
    //...
    APIfunc(Functor());
    //...
}
Вплне нормальная ситуация в С++, пример тому STL.


Это сообщение отредактировал(а) Леопольд - 3.11.2011, 11:33


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Lipetsk
  Дата 3.11.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



Леопольд, вы не видите разности между
Код

typedef int (*func) (void);

и
Код

typedef boost::function<int()> func;

?
PM   Вверх
Леопольд
Дата 3.11.2011, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(Lipetsk @  3.11.2011,  11:24 Найти цитируемый пост)
Леопольд, вы не видите разности между
Голый указатель на функцию это из мира чистого С, в котором нет поддержки ООП. Если не нравится boost::function и не хочется привязываться к сторонней библиотеке, можно использовать шаблоны:
Код
template<typename Callback>
void APIfunc(Callback callback)
{
    //...
    callback();
    //...
}
Такой шаблон тоже будет работать и с указателями на функции и с функциональными объектами. Но "недостаток" его в том, что вся реализация будет в хидерах.


Это сообщение отредактировал(а) Леопольд - 3.11.2011, 11:32


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Lipetsk
  Дата 3.11.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



Цитата(Леопольд @  3.11.2011,  09:26 Найти цитируемый пост)
Голый указатель на функцию это из мира чистого С, в котором нет поддержки ООП

А мне и не нужно ООП
например, мне нужно в классе вызвать DdeInitialize и передать ему уникальную callback функцию, привязанную к экземпляру класса, а не статическую. Эту уникальную функцию в принципе можно сгенерировать используя ассемблерные вставки в код. Но не очень хочется изобретать велосипед, хотя  smile  я уже двигаюсь в этом направлении
PM   Вверх
boostcoder
Дата 3.11.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Lipetsk, а диапазон значений для функции Generator(), известен?
PM WWW   Вверх
Lipetsk
Дата 3.11.2011, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: нет
Всего: 5



Цитата(boostcoder @ 3.11.2011,  10:19)
Lipetsk, а диапазон значений для функции Generator(), известен?

я не понял вопроса
ее значения это функции
много ли экземпляров функций f я собираюсь создать? пока не много
но скоро мне нужно будет заняться одной задачей с COM-объектами, в которой, я планирую, будет аналогичный генератор и вызывать его я буду постоянно (а также удалять отработавшие функции)
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.