Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
taras atavin
3883 / 1757 / 92
Регистрация: 24.11.2009
Сообщений: 27,566
#1

Константы процедурного типа - C++

14.04.2011, 11:04. Просмотров 1908. Ответов 19
Метки нет (Все метки)

Под процедурным типом я понимаю тип указателя на подпрограмму, как это принято в паскале. Поддерживает ли с++ константы процедурного типа и как их декларировать? Пусть например, есть функция с прототипом
C++
1
void f();
. Как объявить константу с адресом этой функции? А лучше даже так: как в типе структуры декларировать поле типа указателя на f и как потом декларировать константный массив структур этого типа?

Добавлено через 29 минут
Так:
C++
1
2
3
4
5
6
typedef void (*voidfuntionvoid)();class TCommand
{
 public:
  char *text;
  voidfuntionvoid proc;
};
можно? Как потом объявить константный массив типа TCommand?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2011, 11:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Константы процедурного типа (C++):

Разработка классов. Переделка из процедурного программирования - C++
Имею отличный строчный калькулятор, сделанный через процедурное программирование, который мне надо реализовать через ООП - через класс. ...

Возврат объекта шаблонного типа от типа Type из специализации шаблона метода от того же типа - C++
Доброго времени суток, пишу класс содержащий несколько std::set от разных типов, нужно сделать метод возвращающий указатель на нужное...

Константы и C++ - C++
Скажите новичку зачем в C++ константы? И для чего они?

Константы и указатели - C++
Как это работает? const int c = 2; const int* p1 = &c; int* p2 = (int*)p1; *p2 = 3; std::cout << c << " " << *p1 << " "...

Вычисляемые константы - C++
Можно ли сделать так, чтобы сначала вычислить, а затем сделать константой?

Указатели на константы - C++
Поясните. Запутался в нескольких примерах. С++ 11 стандарт. 1.int i=0, &r=i; auto a=r; const int ci=i,&cr=ci; auto b=ci; auto...

19
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
14.04.2011, 11:19 #2
taras atavin, Указатели на функции.
std::function/boost::function.
0
taras atavin
3883 / 1757 / 92
Регистрация: 24.11.2009
Сообщений: 27,566
14.04.2011, 11:42  [ТС] #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Указатели на функции.
Где они подробно описаны?
Цитата Сообщение от ForEveR Посмотреть сообщение
std::function/boost::function.
Желательно всё таки без лишних прибамбасов. Если придётся лепить какую то сложную конструкцию для каждйо ветви, то где выигрыш по сравнению с ифами?
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
14.04.2011, 14:06 #4
taras atavin, Почему все что новое и прогрессивное, не уступающее по быстродействию сразу сложное? Ни в std::function ни в boost::function ничего сложного нету.

Если это сложно - тогда конечно да.
C++
1
2
3
4
5
6
void some_foo(int)
{
}
 
std::function<void(int)> f_obj;
f_obj = some_foo;
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.04.2011, 16:53 #5
А чем обычный указатель на функцию не устраивает?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void f()
{ ... }
void f2()
{ ... }
 
typedef void (*voidfuntionvoid)();
 
class TCommand
{
 public:
    TCommand( char * name, voidfuntionvoid ptr )
      : text(name),
       proc( ptr )
    { }
 
  char *text;
  voidfuntionvoid proc;
};
 
const TCommant c[2] = { TCommand( "name", f ), TCommand( "name2" ,f2) };
С точки зрения инициализации не будет отличаться от любой другой константы.

Добавлено через 22 минуты
Хотя, лучше всё же использовать функторы. Тогда будет проще поддерживать функции с различным числом и типами параметров.
0
Evg
Эксперт CАвтор FAQ
18701 / 6669 / 470
Регистрация: 30.03.2009
Сообщений: 18,674
Записей в блоге: 29
14.04.2011, 21:52 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ForEveR Посмотреть сообщение
Почему все что новое и прогрессивное, не уступающее по быстродействию сразу сложное?
Примерно потому: Какой язык лучше учить?

А вообще иногда оказывается, что проще объявлять не тип указателя на функцию, а просто тип функции. А при объявлении указателя добавлять звёздочку к имени переменной. Тогда с таким типом можно будет ещё и внешние функции описывать

C
1
2
3
4
5
6
7
8
9
10
11
12
typedef void (func_type_t)(int, int);
 
/* Эквивалентно extern void f1 (int, int); */
extern func_type_t f1;
 
/* Эквивалентно extern void f2 (int, int); */
extern func_type_t f2;
 
/* Константный массив из двух указателей на функцию.
 * Здесь уже рисуем явную звёздочку после типа, явным образом
 * обозначая, что это указатель */
func_type_t* const a[2] = { f1, f2 };
3
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
14.04.2011, 22:19 #7
Evg, Ну не скажи. boost::function удобнее чем указатели на функции да и к тому же функциональнее + высокий уровень. По-моему в этом нет ничего плохого.
0
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
14.04.2011, 22:40 #8
При неумелом обращении с указателями на функции можно элементарно уложить свой процесс и сидеть ковырять в носу над дебагом. Взамен Вам предлагается готовое, стабильное решение, которое не засоряет код новыми типами.
0
Evg
Эксперт CАвтор FAQ
18701 / 6669 / 470
Регистрация: 30.03.2009
Сообщений: 18,674
Записей в блоге: 29
14.04.2011, 22:51 #9
А чтобы 2+3 сложить, тоже boost надо использовать? Или может как в линуксе, установить ещё какую-нибудь ацкую библиотеку, которая в зависимости ещё 30 других библиотек потащит. Зато 2+3 по-пацански сложим, надёжно. Я это всё к тому, что есть встроенные средства языка, а ради несчастного указателя на функцию тащить буст - это моветон

> При неумелом обращении с указателями

При кривых руках тебя и boost не спасёт
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
14.04.2011, 22:55 #10
Evg, А std::function?)
Ну и boost::function может использоваться в разных ситуациях.

Но если для тебя важнее не удобство работы - тогда пользуйся только указателями на функции...
В таком ключе можно без проблем сказать.

Надо распарсить выражение - с реджексом все получится отлично, но тащить boost::regex в проект это моветон, поэтому будем писать свой парсер.

Надо написать некую вещь, где удобнее boost::lambda - но нееет, тащить boost::lambda это перебор.

Да и еще кучу примеров можно привести, вплоть для описания короткой грамматики, с которой лучше может справится spirit, но нет, будем лучше писать свою.
0
Evg
Эксперт CАвтор FAQ
18701 / 6669 / 470
Регистрация: 30.03.2009
Сообщений: 18,674
Записей в блоге: 29
14.04.2011, 23:09 #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Надо распарсить выражение
Для тебя действительно "распарсить выражение" и "указатель на функцию" это вещи одного и того же порядка сложности? Т.е. числа складываешь ты без boost'а только потому, что в boost'е этого нет?
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
14.04.2011, 23:18 #12
Evg, Нет не поэтому) В основном не одно и то же. Я просто привел пример, меня сильно удивляет, что в С++ ты предлагаешь использовать указатели на функции, которые в С++ никуда не впились, тем паче, что есть готовые решения, тащить boost::function в проект, если есть такая возможность - не считается моветоном. Проект на чистом С++ с использованием STL, RAII по-максимуму и вдруг создание указателя на функцию - смотрится убого, использование function - смотрится красиво и что важнее удобно. Это сейчас задача такова, что просто достаточно сделать указатель на функцию, а завтра может понадобится использовать что-то для чего без использования библиотек - придеться делать все через задницу.
Да без смысла спорить на самом деле. Каждый все равно останется при своем мнении.
0
Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
14.04.2011, 23:31 #13
Цитата Сообщение от Evg Посмотреть сообщение
А чтобы 2+3 сложить, тоже boost надо использовать? Или может как в линуксе, установить ещё какую-нибудь ацкую библиотеку, которая в зависимости ещё 30 других библиотек потащит. Зато 2+3 по-пацански сложим, надёжно. Я это всё к тому, что есть встроенные средства языка, а ради несчастного указателя на функцию тащить буст - это моветон

> При неумелом обращении с указателями

При кривых руках тебя и boost не спасёт
Убавь громкость, дружок. Для домашнего задания поинтеров хватает с головой, а для крупного проекта такой подход выливается в качественный говнокод.
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
14.04.2011, 23:38 #14
Evg, Ну и выражение бывает различным... Допустим надо нам проверить совпадает ли строка с паттерном пять цифр и возможны буквы в верхнем или нижнем регистре.

Можно использовать regex.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <regex>
 
int main()
{
    std::regex pattern("\\d{5}[a-zA-Z]*");
    std::string str;
    std::cin>>str;
    std::smatch match;
    if(std::regex_match(str, match, pattern))
        std::cout<<"Matched\n";
    else
        std::cout<<"Not matched\n";
    system("pause");
}
А можно писать что-то твое. Длиннее не будет, но на кой изобретать велосипед, когда все уже есть?
0
Evg
Эксперт CАвтор FAQ
18701 / 6669 / 470
Регистрация: 30.03.2009
Сообщений: 18,674
Записей в блоге: 29
14.04.2011, 23:46 #15
Цитата Сообщение от ForEveR Посмотреть сообщение
Проект на чистом С++ с использованием STL, RAII по-максимуму и вдруг создание указателя на функцию - смотрится убого, использование function - смотрится красиво и что важнее удобно. Это сейчас задача такова, что просто достаточно сделать указатель на функцию, а завтра может понадобится использовать что-то для чего без использования библиотек - придеться делать все через задницу.
Цитата Сообщение от Manjak Посмотреть сообщение
Для домашнего задания поинтеров хватает с головой, а для крупного проекта такой подход выливается в качественный говнокод.
Где вы большой проект увидели? Человек задал вполне конкретный вопрос: как сделать массив из указателей на функцию. Он не спрашивал, через какие нанобиблиотеки можно реализовать встроенную конструкцию языка. И не спрашивал о том, какие бы библиотеки надо затащить в проект, чтобы он не выглядел убого. Он всего лишь задал простой вопрос про указатель на функцию

При этом хоть убейте не пойму, как использование указателя на функцию в крупном проекте способно превратить его в гавнокод.

Добавлено через 4 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
Evg, Ну и выражение бывает различным... Допустим надо нам проверить совпадает ли строка с паттерном пять цифр и возможны буквы в верхнем или нижнем регистре
В Си или в Си++ есть встроенные (в язык или в стандартную библиотечную поддержку) средства для работы с регулярными выражениями? Нет. Так зачем их сравнивать с указателями на функцию?
0
14.04.2011, 23:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2011, 23:46
Привет! Вот еще темы с ответами:

Экспоненциальные Константы - C++
Всем доброго времени суток. Хотелось бы спросить такую вещь. Вид Экспоненциальной Константы же такой: {E|e} Тогда такая константа что...

константы в классах - C++
в классе используется константа типа double. Как правильно задать ее? как static const double внутри класса или просто написать...

Не различает константы - C++
Добрый вечер. Есть константы в базовом классе:protected: ... // тут enum'ы и структуры const QString FORMAT_DIR = &quot;format&quot;; ...

Символьные константы - C++
Объясните смысл написанного


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru