указатель на функцию без typedef - PullRequest
7 голосов
/ 22 сентября 2010

Можно ли использовать тип предварительно объявленной функции в качестве указателя на функцию без использования typedef?

объявление функции:

int myfunc(float);

использовать объявление функции некоторым синтаксисом какуказатель функции

myfunc* ptrWithSameTypeAsMyFunc = 0;

Ответы [ 7 ]

21 голосов
/ 22 сентября 2010

Не соответствует стандарту 2003 года.Да, с наступающим стандартом C ++ 0x и MSVC 2010 и g ++ 4.5:

decltype(myfunc)* ptrWithSameTypeAsMyFunc = 0;
6 голосов
/ 22 сентября 2010

Да, можно объявить указатель на функцию без typedef, но нет, для этого нельзя использовать имя функции.

Typedef обычно используется, потому что синтаксис объявленияуказатель на функцию немного барочный.Однако typedef не требуется.Вы можете написать:

int (*ptr)(float); 

, чтобы объявить ptr как указатель на функцию, принимающую float и возвращающую int - typedef не задействован.Но опять же, нет синтаксиса, который позволил бы вам использовать имя myfunc для этого.

3 голосов
/ 22 сентября 2010

Можно ли использовать тип предварительно объявленной функции в качестве указателя на функцию без использования typedef?

Я собираюсь немного обмануть

template<typename T>
void f(T *f) {
  T* ptrWithSameTypeAsMyFunc = 0;
}

f(&myfunc);

Конечно, это не совсем без ловушек: он использует функцию, поэтому она должна быть определена, тогда как такие вещи, как decltype, не используют функцию и не требуют, чтобы функция была определена.

1 голос
/ 22 сентября 2010

gcc имеет typeof как расширение для C (не знаю о C ++) (http://gcc.gnu.org/onlinedocs/gcc/Typeof.html).

int myfunc(float);

int main(void) {
    typeof(myfunc) *ptrWithSameTypeAsMyFunc;
    ptrWithSameTypeAsMyFunc = NULL;
    return 0;
}
1 голос
/ 22 сентября 2010

Нет, не без C ++ 0x decltype:

int myfunc(float)
{
  return 0;
}

int main ()
{
  decltype (myfunc) * ptr = myfunc;
}
1 голос
/ 22 сентября 2010

Нет, не в настоящее время.C ++ 0x изменит значение auto и добавит новое ключевое слово decltype, которое позволит вам делать подобные вещи.Если вы используете gcc / g ++, вы также можете использовать его оператор typeof, который очень похож (имеет небольшое различие при работе со ссылками).

0 голосов
/ 22 сентября 2010
int (*ptrWithSameTypeAsMyFunc)(float) = 0;  

См. здесь для получения дополнительной информации об основах.

...