typedefを使用せずに、事前に宣言された関数の型を関数ポインタとして使用することは可能ですか?
関数宣言:
int myfunc(float);
関数ポインタとしていくつかの構文で関数宣言を使用します
myfunc* ptrWithSameTypeAsMyFunc = 0;
typedefを使用せずに、事前に宣言された関数の型を関数ポインタとして使用することは可能ですか?
関数宣言:
int myfunc(float);
関数ポインタとしていくつかの構文で関数宣言を使用します
myfunc* ptrWithSameTypeAsMyFunc = 0;
2003 年の標準とは異なります。はい、今後の C++0x 標準と MSVC 2010 および g++ 4.5 では:
decltype(myfunc)* ptrWithSameTypeAsMyFunc = 0;
はい、typedef なしで関数ポインターを宣言することは可能ですが、関数の名前を使用して宣言することはできません。
関数ポインターを宣言するための構文が少しバロックであるため、通常は typedef が使用されます。ただし、typedef は必須ではありません。あなたは書ける:
int (*ptr)(float);
関数を受け取って返すptr
関数へのポインタとして宣言する- typedef は関与しません。ただし、これを行うために名前を使用できる構文はありません。float
int
myfunc
typedefを使用せずに、事前に宣言された関数の型を関数ポインターとして使用することは可能ですか?
少しごまかします
template<typename T>
void f(T *f) {
T* ptrWithSameTypeAsMyFunc = 0;
}
f(&myfunc);
もちろん、これには落とし穴が完全にないわけではありません。関数を使用するため、定義する必要がdecltype
ありますが、関数を使用せず、関数を定義する必要がない場合などです。
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;
}
いいえ、現時点ではありません。C++0x は の意味を変更し、このようなことを可能にauto
する新しいキーワードを追加します。decltype
gcc/g++ を使用している場合は、そのtypeof
演算子の使用を検討することもできますが、これは非常によく似ています (参照を処理するときに微妙な違いがあります)。
いいえ、 C++0x なしではありませんdecltype
:
int myfunc(float)
{
return 0;
}
int main ()
{
decltype (myfunc) * ptr = myfunc;
}
int (*ptrWithSameTypeAsMyFunc)(float) = 0;
基本について詳しくはこちらをご覧ください。