最近は便利ということで猫も杓子もQtライブラリを使った実装をしている。
本当にそれで良いのか!?
依存しちゃって良いのか!?
ソースコード上にQ_OBJECTというおまじないが出てきてモヤモヤするのは私だけだろうか?
というわけでQtの実装をSTLへ変換してみる。
そのためにQtライブラリとSTLライブラリを比較してみる。
<QVector> ⇔ <vector>
class:QVector std::vector
<QMutex> ⇔ <mutex>
class:QMutex std::mutex
<Qmap> ⇔ <map>
class: QMap std::map
<Qtimer> ⇔ <chrono>
<QThread> ⇔ <thread>
class QThread std::thread
<QEvent> ⇔ Nothing
イベントの実装方法はOSやAPIによって様々です...!?
そもそもQObjectを継承すると何が嬉しいのか
・[qt "オブジェクト同士の親子関係の管理" l=objecttrees]
・ [qt "強力でシームレスなオブジェクト間通信 - シグナルとスロット"
l=signalsandslots]
・ [qt "イベントのハンドリング" l=eventsandfilters]
・[qt "プロパティシステム" l=properties]
・[qt "国際化に必要な文字列の翻訳の仕組み" l=i18n]
イベントハンドリングの実装でQOjectの効果は絶大だった
QObjectを使用すると、シグナル/スロットを実装できるようになる。
これはSTLにはない機構だ。
Qtを使わないでシグナル/スロットを使いたいのであれば、boostライブラリ(boost/signals)を使用することになる。
参考
STLで実装する場合
C++11 の std::function を使って signal-slot ライクにメンバー関数をコールバック | cutlassfish