Странная функция - PullRequest
       2

Странная функция

1 голос
/ 16 января 2012

У меня есть объявление функции в c ++, и мне нужно знать, как оно работает:

 template<class x>
    int fun(x, x(*)(x*) );

Первый аргумент - это объект типа x.А как описать второй?

Ответы [ 3 ]

5 голосов
/ 16 января 2012

Это объявление шаблонной функции, которая возвращает целое число и принимает в качестве параметров x и указатель на функцию, которая возвращает x и принимает в качестве параметра x*.

Часть x(*)(x*) - это часть, которая означает «указатель на функцию, которая возвращает x и принимает в качестве параметра x*». Первый x - это тип возвращаемого значения, (*) указывает, что это указатель на функцию (если у параметра есть имя, оно будет записано x(*argname)(x*)), а третий x* - это просто аргумент. .

Вызов это будет выглядеть так:

int f(int* iptr) { return something; }

fun(4, f); // no need for the explicit template parameter because it can be deduced

Или, в более общем смысле,

template<typename x>
x functionname(x* xptr) { return something; }

Это не будет работать в C, потому что, как сказал Даниэль Уайт в комментарии, C не имеет шаблонов.

4 голосов
/ 16 января 2012

Второй тип параметра, где x - это класс:

x(*)(x*)

Означает "указатель (*) на функцию, возвращающую x и принимающую x*. Например:

class MyClass {};
MyClass doit(MyClass* arg) { return *arg; }
MyClass instance;
int result = fun(instance, doit);
1 голос
/ 16 января 2012

Это указатель на функцию, которая возвращает объект типа x и получает один параметр указателя на тип x.

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