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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как сделать шаблон типа указателя на функцию? 
:(
    Опции темы
victor79
Дата 25.7.2011, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


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

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



т.е. что бы было что-то подобное:
Код

template<class T>
typedef void (*t_fn)( T val );

t_fn<int> abc;

void doint( int ii ) {
   printf("%i\n", ii);
}

int main() {
   abc = doint;
   abc(55);
}


Добавлено через 12 минут и 48 секунд
у меня объявлен шаблон с несколькими типами, и на эти несколько типов сделаны несколько переменных в нем, и на эти несколько переменных еще нужно привязать функции обработчики, которые устанавливаются в отдельные переменные, и если они не установлены то должны вызваться дефаултные обработчики. И между собой эти обработчики подобны по синтаксису - всякое копирование. И что бы не плодить множество определений обработчиков - и нужен такой шаблон.
PM MAIL WWW   Вверх
mes
Дата 25.7.2011, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



обернуть typedef в структуру..


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


программист
*


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

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



Цитата(mes @  25.7.2011,  22:51 Найти цитируемый пост)
обернуть typedef в структуру.. 


сначала не подумал, что можно обернуть ТАКИМ образом. Придется при установке и вызове добираться через точку, но это уже гораздо проще.

Код

template<class T>
struct t_func {
     typedef void (*t_fn)(T val);
     t_fn fn;
};

t_func<int> abc;

void doint( int ii ) {
   printf("%i\n", ii);
}

int main() {
   abc.fn = doint;
   abc.fn(55);
}


Добавлено @ 03:35
возможно так даже лучше будет объединять в блоки функции. типа:
Код

class t_func {
    typedef ...
    typedef ...
    typedef ...
    t_fn_create  fn_create;
    t_fn_copy    fn_copy;
    t_fn_del      fn_del;
}



Это сообщение отредактировал(а) victor79 - 26.7.2011, 03:38
PM MAIL WWW   Вверх
victor79
Дата 26.7.2011, 05:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


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

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



или еще вариант
Код

template<class T>
struct t_func {
   typedef void (*fn)(T val);
};

t_func<int>::fn abc;

void doint( int ii ) {
   printf("%i\n", ii);
}

int main() {
   abc = doint;
   abc(55);
}

PM MAIL WWW   Вверх
afiskon
Дата 26.7.2011, 06:38 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 4



По-нормальному это делается через функтор, то есть объект с переопределенным operator(). Такие объекты помимо прочего можно использовать вместе с STL. Пример есть на вики.
PM MAIL WWW   Вверх
EnergoHokum
Дата 26.7.2011, 13:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


Эксперт
****


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

Репутация: 22
Всего: 135



EnergoHokum, единственный минус - нельзя обнулить (вернее межно, но потом никак не проверишь, что там 0).

Цитата(victor79 @  25.7.2011,  21:06 Найти цитируемый пост)
, и если они не установлены то должны вызваться дефаултные обработчики.

я понял под "не установлены" - равны 0

Это сообщение отредактировал(а) borisbn - 26.7.2011, 14:10


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
victor79
Дата 26.7.2011, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


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

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



саму функцию я как раз то и не хочу заворачивать в структуру. Это лишние конструкции, которые уже не запаковать в библиотечные, и располагать их придется в основной структуре программы. Мне просто нужен тип типа ссылки на функцию и шаблонизированный. Это вроде как решил.

Вот если бы еще можно было делать статическими операторы определенные в структурах... Типа:
Код

struct t_fnspc {
    static int operator+( int a, int b) { /* do something */ };
};

int main() {
     int res = 5 t_fnspc::+ 10;
}

или другими способами определить диадические/монадические операторы с НАЗВАНИЕМ. Но это уже другой вопрос.

(на момент написания поста линку про функцию одного аргумента еще не увидел, нужно подумать про это свойство)

Это сообщение отредактировал(а) victor79 - 26.7.2011, 15:21
PM MAIL WWW   Вверх
borisbn
Дата 26.7.2011, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 22
Всего: 135



Цитата(victor79 @  26.7.2011,  15:15 Найти цитируемый пост)
 int res = 5 t_fnspc::+ 10;

жесть. а чем operator() не устраивает ?
Код

struct t_fnspc {
    int operator()( int a, int b ) { return 0; }
};

int main() {
     int res = t_fnspc()( 5, 10 );
}

только лишними скобками ?

--------------------
уупс. afiskon уже говорил это... просмотрел

Это сообщение отредактировал(а) borisbn - 26.7.2011, 15:27


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
victor79
Дата 26.7.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


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

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



Цитата(borisbn @  26.7.2011,  15:20 Найти цитируемый пост)
жесть. а чем operator() не устраивает ?
Код

struct t_fnspc {
    int operator()( int a, int b ) { return 0; }
};
int main() {
     int res = t_fnspc()( 5, 10 );
}

только лишними скобками ? 

да в этом примере именно лишними скобками и не устраивает. Если выстраивать последовательности из 5-10 подряд операторов, то в скобках слишком путаешься.

Это сообщение отредактировал(а) victor79 - 26.7.2011, 15:24
PM MAIL WWW   Вверх
bsa
Дата 26.7.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



victor79, вообще-то, так никто не делает. Обычно, делают так:
Код
struct t_fnspc {
    int operator()(int a, int b) { return 0; }
};
int main() {
     t_fnspc fnspc;
     int res = fnspc(5, 10);
}
Хотя, чаще используют в алгоритмах: 
Код
template<class InputIterator, class Functor>
void some_algorithm(InputIterator first, InputIterator last, Functor func)
{
   for(; first != last; ++first)
      *first = func(*first, 1234);
}
...
some_algorithm(container.begin(), container.end(), t_fnspc());

PM   Вверх
victor79
Дата 27.7.2011, 02:13 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


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

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



Цитата(EnergoHokum @  26.7.2011,  13:27 Найти цитируемый пост)
Указатель на функцию одного аргумента из STL. 

размышляя над примером оператора () пришел к выводу  smile , что это то же что и мой вариант t_fn<int>::fn, но там не нужно использовать в синтаксисе :: но будет вызываться конструктор - либо явный - дополнительная писанина, либо не явный - если автоконструирование - что мне не очень нравиться.

В общем мой вариант :: мне нравиться больше, по крайней мере пока не начну юзать STL.
PM MAIL WWW   Вверх
EnergoHokum
Дата 27.7.2011, 06:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

пока не начну юзать STL

С этим медлить не стоит. smile
PM MAIL ICQ   Вверх
bsa
Дата 27.7.2011, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(victor79 @  27.7.2011,  02:13 Найти цитируемый пост)
не явный - если автоконструирование - что мне не очень нравиться

Это почему еще? Для простых функторов вполне достаточно стандартного конструктора. А сложные иначе не сделаешь.
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.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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