2016-10-19 3 views
2

私は自分のコード内でこのように、特定のキーボードコールバック関数を宣言:キーボードイベントは、コールバック関数に渡された実際のイベントで、viewer_voidパラメータがためのウィンドウを生成PCLVisualizerクラスへのポインタであるT :: *は関数のパラメータリストの宣言で何を表していますか?

void keyboardEventCallback(const pcl::visualization::KeyboardEvent &event, void* viewer_void, void* widget_void); 

レンダリングし、widget_voidはQtとインターフェースするウィジェットへのポインタです。 PCLのドキュメントで

、登録機能が

boost::signals2::connection registerKeyboardCallback(void(T::*callback)(const pcl::visualization::KeyboardEvent&, void*), T& instance, void* cookie=nullptr) 

のようにキーボードの機能を登録するための引数を渡すだから私の質問はT::*の意味は、登録関数宣言、およびの内側にあるもの、ですなぜ私はこれを渡すことが許可されていないです:

m_visはビジュアライザある
m_vis->registerKeyboardCallback(keyboardEventCallback, (void*)&m_vis, (void*)this); 

keyboardcallbackがコールバックであり、これがウィジェットです。

なぜこのように登録できないのですか?これはポイントクラウドライブラリのためのものです。

答えて

1

これはメンバー関数の構文です。

例:

class A{ 
    int giveMe5(); 
}; 

&A::giveMe5; // will be of type int(A::*)() 

なぜタイプは、無料の機能と静的メンバ関数の違いは何ですか? メンバ関数には、関数が呼び出されるオブジェクトを指す暗黙のパラメータがあるためです。 Tの意味は何であるかhttps://isocpp.org/wiki/faq/pointers-to-members#fnptr-vs-memfnptr-types

3

:: *登録機能宣言

これは、メンバへのポインタの構文です内部:

はを見てください。のは、パラメータの全種類と名前を見てみましょう:

void(T::*callback)(const pcl::visualization::KeyboardEvent&, void*) 

これはcallbackという名前の変数の宣言です。メンバー関数へのポインタはです。より正確には、クラスTのメンバ関数へのポインタです。

我々は種類のうち、名前を取るならば、我々はより明確に物事を参照してください。

// class name ---v  v------- parameters 
      void(T::*)(const pcl::visualization::KeyboardEvent&, void*) 
//   ^---- return type 

それは、実際にはvoidを返すクラスTのメンバーを関数へのポインタです。これは、を厳密にという2つのパラメータ:const pcl::visualization::KeyboardEvent&ととする関数です。

は、なぜ私はそれは簡単です。この

を渡すことが許されておりません。あなたの関数の種類を見てください:

using func_type = decltype(keyboardEventCallback); 
// hint: the type is: void(*)(const pcl::visualization::KeyboardEvent&, void*, void*) 

はのサイドで2種類の側を比較してみましょう:

void(*)(const pcl::visualization::KeyboardEvent&, void*, void*) 
void(T::*)(const pcl::visualization::KeyboardEvent&, void*) 

まず、あなたの関数はメンバ関数ではない、それはプレーンな関数ポインタです。それは同じタイプではありません。次に、3つの引数があります。パラメータの型は2つのみです。これは違う。


ここでどのように修正できますか?

あなたはラムダ使用することができます

auto myCallback = [](const pcl::visualization::KeyboardEvent& e, void* c) { /* ... */ } 

using lambdaType = decltype(myCallback); 

// Be careful here, we don't want our lambda to go out of scope when it is called. 
m_vis->registerKeyboardCallback(&lambdaType::operator(), myCallback, this); 

それとももっと簡単:ちょうどあなたのクラス内keyboardEventCallbackを定義し、それを送信します。

// don't forget: keyboardEventCallback must receive the same parameter as asked. 
m_vis->registerKeyboardCallback(&MyClass::keyboardEventCallback, *this, this); 
関連する問題