ふるお〜と!- FullAuto

AI・ロボットが普及しBI(ベーシックインカム)が早急に実現されることを願う元ニートのブログ

ふるお〜と!-FullAuto

QTで実装されたソースをSTL(標準ライブラリ)で実装できるか?

最近は便利ということで猫も杓子も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

Qt をはじめよう! 第7回: Qt のオブジェクトモデルを理解しよう