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

Поиск:

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



****


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

Репутация: 15
Всего: 26



надо написать код, который 
1) принимает Callable параметр
2) парсит его тип, определяя типы аргументов и возвращаемого значения
3) сохраняет его
4) вызывает его, передавая ему параметры нужных типов

примерный код для указателей на функции такой

Код

template<typename R, typename T1, typename T2>
void test( const string& name, R(*fn)(T1,T2) )
{
     struct Wrapper
     {
         R(*fn)(T1,T2);

         some_output_t operator() ( some_input_t input )
         {
              // временные переменные - для лучшей читаемости

              T1 t1 = input.get<T1>(1);
              T2 t2 = input.get<T1>(2);

              R r = (*fn)( t1, t2 );
              return some_output_t( r );
         }

     } wrapper = {fn};

     boost::function<some_output_t(some_input_t)> callback = wrapper;
     callback_registry[name] = callback;
}

..... тожесамое для другого количества аргументов ....

//использование
void foo(int, float);
test("foo", &foo);


в общем-то с указателями на функции все понятно, но хотелось бы как минимум еще обрабатывать результат bind(&Cls::Met, obj, _1, _2)

для этого можно использовать следующий код, подходящий для обоих случаев
Код

template<typename R, typename T1, typename T2>
void foo( const string& name, boost::function<R(T1,T2)> )
.....

//использование
boost::function<void(int,float)> f = boost::bind( &Foo::foo, foo, _1, _2 );
test("foo", f);
// ^ почему-то не работает
// test("foo", boost::bind( &Foo::foo, foo, _1, _2 ) );


однако хотелось бы рассмотреть и другие варианты
PM MAIL ICQ   Вверх
bsa
Дата 20.12.2009, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Код
template<typename Callable>
void foo( const string& name, Callable proc )

PM   Вверх
GoldFinch
Дата 20.12.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



bsa, мне из этого Callable надо выдрать типы параметров,
чтобы сгенерить код, который эти параметры получит и преобразует к нужному типу
т.е. например на входе будет vector<string> с параметрами и надо каждый параметр преобразовать к нужному типу перед вызовом коллбека

Код

template<typename R, typename T1, typename T2>
void test( const string& name, R(*fn)(T1,T2) )

.........
         string operator() ( const vector<string>& input )
         {
              T1 t1 = lexical_cast<T1>( input[0] );
              T2 t2 = lexical_cast<T2>( input[0] );
              R r = (*fn)( t1, t2 );
              return lexical_cast<string>( r );
         }

PM MAIL ICQ   Вверх
xvr
Дата 20.12.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата

bsa, мне из этого Callable надо выдрать типы параметров,
Ты вроде boost::function используешь, вот из него и выдирай - arg1_type, arg2_type, arg3_type и т.д.

PM MAIL   Вверх
GoldFinch
Дата 20.12.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



хм... может действительно что-то выйдет с 
Код

template<typename Signature>
void test( boost::function<Signature> fn )

PM MAIL ICQ   Вверх
GoldFinch
Дата 30.12.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



ап.

я правильно понимаю, что boost.function_types работает только со встроенными Callable типами, и не работает с функторами?
PM MAIL ICQ   Вверх
GoldFinch
Дата 30.12.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



такой код не работает
Код

#include <boost/function.hpp>

void foo() {}

template<typename Signature>
void test( boost::function<Signature> fn )
{
}

int main()
{
    test(&foo);
}

с ошибкой 
не удалось вывести аргумент шаблон для "boost::function<Signature>" из "void (__cdecl *)(void)"
PM MAIL ICQ   Вверх
xvr
Дата 30.12.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата

я правильно понимаю, что boost.function_types работает только со встроенными Callable типами, и не работает с функторами? 

Цитата

такой код не работает
Должен работать (в обоих случаях)
Какой компилятор?

PM MAIL   Вверх
GoldFinch
Дата 30.12.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



xvr, msvc2008,msvc2010b2, gcc4.1.2  (codepad.org)
http://codepad.org/EmOHP33U

PM MAIL ICQ   Вверх
GoldFinch
Дата 30.12.2009, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



Код

#include <boost/function_types/function_arity.hpp>

//void foo(int,int) {}
struct Bar{ void operator()(int,int,int){} } bar;

template<typename Callable>
int test( Callable fn )
{
    return boost::function_types::function_arity<Callable>::value;
}

int main()
{
    return test(bar);
}

не работает.
алсо тут нет функторов:
http://www.boost.org/doc/libs/1_41_0/libs/...sification.html
PM MAIL ICQ   Вверх
GoldFinch
Дата 31.12.2009, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



Цитата(GoldFinch @  30.12.2009,  16:39 Найти цитируемый пост)
template<typename Signature>
void test( boost::function<Signature> fn )

вообще я сомневаюсь что оно в принципе может работать
вот такое - работает, но это конечно не то что надо
Код

#include <boost/function.hpp>
void foo() {}
template<typename Signature>
void test( boost::function<Signature> fn )
{
}
int main()
{
    boost::function<void()> f = &foo;
    test(f);
}

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


Опытный
**


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

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



Используй "перегрузку".
Код

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

void foo() {}
int bar(char, int, double, boost::function<void()>&) {return 0;}

template<typename Signature>
void test(boost::function<Signature> fn){
    std::cout<<"debug print"<<std::endl;
}
template<typename Signature>
inline void test(Signature& ref){
    test(boost::function<Signature>(ref));
}

int main()
{
    test(foo);
    test(bar);
    boost::function<void()> fn(foo);
    test(fn);
}

В С++, кроме указателей, есть ссылки на функции.

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


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



****


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

Репутация: 15
Всего: 26



Леопольд,
а функторы-то как?
PM MAIL ICQ   Вверх
mes
Дата 31.12.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(GoldFinch @  31.12.2009,  11:43 Найти цитируемый пост)
а функторы-то как? 

если правильно понял вопрос, то функторы привязываются к boost::function bind`ом.



--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 31.12.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



mes, это слишком неудобно, алсо бинд там не нужен

говоря "функторы" я имею ввиду в основном как раз результаты бинда

Добавлено через 4 минуты и 4 секунды
вопрос решен.
надо проверять является ли аргумент классом, и если да- брать указатель на operator() и анализировать его
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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