указатель на функцию без typedef

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

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

int myfunc(float);

используйте объявление функции с помощью некоторого синтаксиса в качестве указателя на функцию

myfunc* ptrWithSameTypeAsMyFunc = 0;

person David Feurle    schedule 22.09.2010    source источник
comment
Вам нужен указатель на функцию, который может указывать только на вашу собственную функцию?   -  person wheaties    schedule 22.09.2010
comment
@wheaties Мне нужен указатель функции на функцию с той же сигнатурой, что и у myfunc   -  person David Feurle    schedule 22.09.2010
comment
Знаете ли вы, что можете применять typedef к объявлениям функций для определения их типа? typedef int myfunc(float); myfunc *ptrWithSameTypeAsMyFunc = 0;? Большинство людей не знают об этом и думают, что им нужен уродливый синтаксис (*foo).   -  person Johannes Schaub - litb    schedule 22.09.2010


Ответы (7)


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

decltype(myfunc)* ptrWithSameTypeAsMyFunc = 0;
person Anthony Williams    schedule 22.09.2010
comment
проблема в том, что мой код не компилируется с включенным С++ 0x. Так что это непригодное для меня решение: S - person David Feurle; 22.09.2010
comment
С g++ вы можете использовать typeof(myfunc) вместо decltype(myfunc), и он работает даже в режиме, отличном от C++0x. - person Anthony Williams; 23.09.2010
comment
для меня это решение непригодно для использования, но я приму это как ответ. Возможно, я изменю свой код, пока он не скомпилируется с помощью c++0x. - person David Feurle; 23.09.2010

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

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

int (*ptr)(float); 

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

person Tyler McHenry    schedule 22.09.2010

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

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

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

f(&myfunc);

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

person Johannes Schaub - litb    schedule 22.09.2010

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

person Jerry Coffin    schedule 22.09.2010

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

int myfunc(float)
{
  return 0;
}

int main ()
{
  decltype (myfunc) * ptr = myfunc;
}
person wilx    schedule 22.09.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;
}
person pmg    schedule 22.09.2010
comment
GCC не нуждается в расширении typeof в C++, потому что оно реализует (скоро станет стандартным) decltype, которое служит почти той же цели. - person MSalters; 22.09.2010

int (*ptrWithSameTypeAsMyFunc)(float) = 0;  

Подробнее об основах см. здесь.

person Steve Townsend    schedule 22.09.2010