私は C++ で関数型を試してきました。次のような関数へのポインタ型を意味するものではないことに注意してください。
typedef void (*voidFuncPtr)();
しかし、よりエキゾチックです:
typedef void (voidFunc)();
次のコードがコンパイルされるとは思っていませんでしたが、驚くべきことにコンパイルされました。
template<voidFunc func>
class funcClass
{
public:
void call() { func(); };
};
void func()
{ }
void Test()
{
funcClass<func> foobar;
foobar.call();
}
ただし、funcClass に以下を追加しようとすると:
voidFuncPtr get() { return &func; }
エラーが発生しますAddress expression must be an lvalue or a function designator
ここでの私の最初の質問は次のとおりです。コンパイラは、func 型が実際にインスタンスを渡すことができるものであるふりをするために、どのような黒魔術を使用していますか? 参照のように扱っているだけですか?2 番目の質問は、それを呼び出すことさえできるのに、なぜそのアドレスを取得できないのかということです。また、これらの非ポインタ関数型は何と呼ばれますか? boost::function のためにそれらを発見しただけで、それらに関するドキュメントを見つけることができませんでした。