В чем заслуга типа «функция» (не «указатель на функцию») - PullRequest
9 голосов
/ 21 декабря 2010

Читая стандарт C ++, я вижу, что есть типы «функции» и «указатель на функцию»:

typedef int func(int);     // function
typedef int (*pfunc)(int); // pointer to function
typedef func* pfunc;       // same as above

Я никогда не видел типы функций, используемые вне примеров (или, может быть, я не сделалне признаете их использование?).Некоторые примеры:

func increase, decrease;            // declares two functions
int increase(int), decrease(int);   // same as above

int increase(int x) {return x + 1;} // cannot use the typedef when defining functions
int decrease(int x) {return x - 1;} // cannot use the typedef when defining functions

struct mystruct
{
    func add, subtract, multiply;   // declares three member functions
    int member;
};

int mystruct::add(int x) {return x + member;} // cannot use the typedef
int mystruct::subtract(int x) {return x - member;}

int main()
{
    func k; // the syntax is correct but the variable k is useless!
    mystruct myobject;
    myobject.member = 4;

    cout << increase(5) << ' ' << decrease(5) << '\n'; // outputs 6 and 4
    cout << myobject.add(5) << ' ' << myobject.subtract(5) << '\n'; // 9 and 1
}

Видя, что типы функций поддерживают синтаксис, который не отображается в C (объявление функций-членов), я думаю, они не просто часть багажа C, который C ++ должен поддерживать в обратном направлении.совместимость.

Так есть ли какое-нибудь применение для типов функций, кроме демонстрации какого-то прикольного синтаксиса?

Ответы [ 4 ]

4 голосов
/ 21 декабря 2010

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

Типы функций сами по себе являются фундаментальной концепцией, встроенной в языки C и C ++. Они используются все время. Вы просто не можете жить без них. Каждый раз, когда вы объявляете функцию, вы объявляете сущность типа функции. Каждый раз, когда вы используете указатель на функцию, вы используете указатель на тип функции. И т.д.

Что касается возможности создания имен typedef для типов функций ... Я не вижу особого смысла в этом. Я думаю, что это часть багажа C, которая была немного расширена для C ++ только потому, что это было легко сделать.

Как вы правильно заметили, для определения функций-членов можно использовать имена typedef для типов функций (а в C ++ вы также можете включить спецификатор const в typedef, как в typedef int MemberType() const;), но, например, вы не можете используйте эту функцию с типами функций, передаваемыми в качестве параметров шаблона.

0 голосов
/ 21 декабря 2010

Примером того, почему это полезно, является boost , где вы часто это видите. Например, в библиотеке сигналов2:

boost::signals2::signal<void (int, int)> MySignal;

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

0 голосов
/ 21 декабря 2010

Вы видите это в новых объектах функций в Boost / TR1 / C ++ 0x.

std::function<void()> принимает любой объект с оператором (), который возвращает void и не принимает аргументов.

0 голосов
/ 21 декабря 2010

boost: функция использует этот синтаксис, называемый «предпочтительным» синтаксисом.
Кажется, что синтаксис не используется широко? Сравнение с указателем на функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...