さまざまなタイプの多数のハードウェア デバイスが接続されたリアルタイム コントローラ アプリケーションがあります。
すべてのデバイスは多くのコードを共有していますが、それぞれにデバイス タイプ固有のものもあります。新しいタイプのハードウェアで簡単に拡張できるように、このコードを記述しようとしています。
接続された各デバイスには、個別のスレッドで実行されるイベント マネージャー機能が必要です。基本クラスに共通のものを保持したいと思います。それを「デバイス」と呼び、ハードウェア固有のコードを派生クラスに入れます。
そのため、共通のものを使用してデバイスの基本クラスを作成し、イベント マネージャーを純粋仮想にします。次に、各派生クラスがそれを実装します。
次に、システムの起動時に、接続されているすべてのハードウェア デバイスのベクトルを作成し、適切な派生クラスのインスタンスへのポインターをそこにプッシュします。
ここで、ベクター内の各インスタンスに対して boost::thread を開始したいと思います。各スレッドは、ベクター内のそのインスタンスからイベント マネージャー関数を実行する必要があります。
だから私は次のようなことを試みます:
Class Device {
...
boost::thread thread;
void manager() = 0;
...
}
Class SpecificDevice1 : public Device {
...
void manager();
}
SpecificDevice1::manager() {
...do stuff here...
}
Class SpecificDevice2 : public Device {
...
void manager();
}
SpecificDevice2::manager() {
...do stuff here...
}
Class Config {
...
std::vector<Device*> devices;
...
}
Config config;
...config.devices get populated with pointers to instances of SpecificDevice1 and SpecificDevice2...
for( auto &device : config.devices ) {
device->thread = boost::thread( device->manager );
};
私はこれの多くの異なる順列を試しましたが、私はいつも最終的に
エラー: 'boost::thread::thread()' の呼び出しに一致する関数がありません
...たとえデバイスを適切な SpecificDeviceX クラスへのポインタに dynamic_cast しても、同じエラーが発生します。