#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
void cb(int x)
{
std::cout <<"print inside integer callback : " << x << "\n" ;
}
void cb(float x)
{
std::cout <<"print inside float callback :" << x << "\n" ;
}
void cb(std::string& x)
{
std::cout <<"print inside string callback : " << x << "\n" ;
}
int main()
{
void(*CallbackInt)(void*);
void(*CallbackFloat)(void*);
void(*CallbackString)(void*);
CallbackInt=(void *)cb;
CallbackInt(5);
CallbackFloat=(void *)cb;
CallbackFloat(6.3);
CallbackString=(void *)cb;
CallbackString("John");
return 0;
}
上記のコードは3つの機能を持っていますが、3つのコールバックを作成してパラメータに応じてオーバーロードされた関数を呼び出すことができます。 CallbackIntは、パラメータとしてintを使用してcb関数を呼び出すために使用され、同様に2つの値を保持します。コンテキストタイプ情報のないオーバーロードされた関数
しかし、コンパイルすると以下のようなエラーが表示されます。最初のエラーのために
function_ptr.cpp: In function ‘int main()’:
function_ptr.cpp:29:21: error: overloaded function with no contextual type information
CallbackInt=(void *)cb;
^~
function_ptr.cpp:30:14: error: invalid conversion from ‘int’ to ‘void*’ [-fpermissive]
CallbackInt(5);
^
function_ptr.cpp:32:23: error: overloaded function with no contextual type information
CallbackFloat=(void *)cb;
^~
function_ptr.cpp:33:18: error: cannot convert ‘double’ to ‘void*’ in argument passing
CallbackFloat(6.3);
^
function_ptr.cpp:35:24: error: overloaded function with no contextual type information
CallbackString=(void *)cb;
^~
function_ptr.cpp:36:24: error: invalid conversion from ‘const void*’ to ‘void*’ [-fpermissive]
CallbackString("John");
'無効*'のparamater関数ポインタを持っていない理由:あなたは、コンパイラに十分な情報が得られた場合
しかし、それはそれを推測することができますか? - > 'void(* CallbackInt)(int); ' –
そしてなぜこれらのすべてのキャスト? - > 'CallbackInt = &cb;'(@FilipKočicaによって変更された後) –
オーバーロードされた 'operator()'を持つ呼び出し元ラッパーを書く方が良いでしょう。別の変数にコールバックを格納する必要がある場合は、 'void(void *);の代わりに関数ポインタの型を正しく宣言する必要があります。 – VTT