8

typedefを使用せずに、事前に宣言された関数の型を関数ポインタとして使用することは可能ですか?

関数宣言:

int myfunc(float);

関数ポインタとしていくつかの構文で関数宣言を使用します

myfunc* ptrWithSameTypeAsMyFunc = 0;
4

7 に答える 7

23

2003 年の標準とは異なります。はい、今後の C++0x 標準と MSVC 2010 および g++ 4.5 では:

decltype(myfunc)* ptrWithSameTypeAsMyFunc = 0;
于 2010-09-22T14:54:18.067 に答える
7

はい、typedef なしで関数ポインターを宣言することは可能ですが、関数の名前を使用して宣言することはできません。

関数ポインターを宣言するための構文が少しバロックであるため、通常は typedef が使用されます。ただし、typedef は必須ではありません。あなたは書ける:

int (*ptr)(float); 

関数を受け取って返すptr関数へのポインタとして宣言する- typedef は関与しません。ただし、これを行うために名前を使用できる構文はありません。floatintmyfunc

于 2010-09-22T14:54:21.543 に答える
3

typedefを使用せずに、事前に宣言された関数の型を関数ポインターとして使用することは可能ですか?

少しごまかします

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

f(&myfunc);

もちろん、これには落とし穴が完全にないわけではありません。関数を使用するため、定義する必要がdecltypeありますが、関数を使用せず、関数を定義する必要がない場合などです。

于 2010-09-22T18:34:03.067 に答える
1

gcc にはtypeofC の拡張機能があります (C++ については知りません) ( http://gcc.gnu.org/onlinedocs/gcc/Typeof.html )。

int myfunc(float);

int main(void) {
    typeof(myfunc) *ptrWithSameTypeAsMyFunc;
    ptrWithSameTypeAsMyFunc = NULL;
    return 0;
}
于 2010-09-22T15:03:13.803 に答える
1

いいえ、現時点ではありません。C++0x は の意味を変更し、このようなことを可能にautoする新しいキーワードを追加します。decltypegcc/g++ を使用している場合は、そのtypeof演算子の使用を検討することもできますが、これは非常によく似ています (参照を処理するときに微妙な違いがあります)。

于 2010-09-22T14:56:19.687 に答える
1

いいえ、 C++0x なしではありませんdecltype:

int myfunc(float)
{
  return 0;
}

int main ()
{
  decltype (myfunc) * ptr = myfunc;
}
于 2010-09-22T14:58:24.913 に答える
0
int (*ptrWithSameTypeAsMyFunc)(float) = 0;  

基本について詳しくはこちらをご覧ください。

于 2010-09-22T14:55:36.080 に答える