2011/07/31

[c++]暗黙のキャスト

ここ最近、Cでしか書いていないので、C++のことはずいぶん忘れている。
ちょっと思い出していかないといかん。

Qtの本を読みながらソースを見ていくと、こんな行があった。

  newAction
->setShortcut(tr("Ctrl+N"));

Ctrlキー+Nキーを押したときに動作するのだ、ということを設定している。

私が思ったのは「Qtって、文字列に書いたら自動的にやってくれるんだねぇ」だった。
しかし、文字列ってことは、誰かがそれを解析していることになる。
解析して、「Ctrl」と「N」に分割して、それをフラグにしてうんたらかんたら、となるはずだ。
そういう処理は、私はあまりお好きではない。
できればフラグで与えてしまって終わり、としたい。
解析にコストをかける必要がないときには、なくしてしまいたい。

では、とQAction::setShortcut()の仕様を見た。

void QAction::setShortcuts ( constQList<QKeySequence> & shortcuts )

void QAction::setShortcuts (QKeySequence::StandardKey key )

この2つしかない。
暗黙で何か行われているようだ。


intやcharなどのプリミティブ型は、よく暗黙でキャストされている。
また、継承関係にあるクラスについても、よくあることだ。
そうでない場合、何かしてやらないといけないと思う。
ここら辺の記憶が曖昧なので、順に見ていこう。


まず、引数から。

tr("Ctrl+N")

QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 )[static]

trはQObjectクラスのstatic関数で、ほぼすべてのQtクラスはQObjectを継承していると思う。
なので、QObject::をつけずにアクセスできる。
この人は、QStringオブジェクトを返している。

QAction::setShortcuts()は2つあるが、片方はいかにもコンテナって感じなので、気にしなくてよいだろう。
今回呼び出されているのは、引数がQKeySequence::StandardKey型の方のはず。。

QKeySequence::StandardKeyというのは、enumだ。
数値とQStringに互換性はないな・・・。

QKeySequenceクラスにこういうのがあった。

QKeySequence::QKeySequence ( const QString & key )

これは、なんか近いぞ。
QKeySequence::StandardKey型ではなく、QList<QKeySequence>型をとるのだろうか。

QList::QList ( const QList<T> & other )

違うな。
なにかおかしい。。。。


ここでQActionのヘッダを見ていると、こうなっていた。

void setShortcuts(const QList<QKeySequence> &shortcuts);
void setShortcuts(QKeySequence::StandardKey);

やはり、ヘルプに漏れがあるわけではないのか。。。ん?

void setShortcut(const QKeySequence &shortcut);

単数形の関数がある!
しかし、ヘルプにはなかったぞ??

ヘルプ内を検索してみると・・・関数名一覧やショートカットの説明には出てきたけれども、関数詳細には出てきていなかった。
何と言うことだ・・・・。


void setShortcut ( const QKeySequence & shortcut )


はい、こんな実装です。
つまり今回では、QStringが暗黙でQKeySequenceオブジェクトに変換(生成)されていた、というわけだ。
ヘルプで関数仕様がわかれば、たぶんネタにしてなかったお話だ。

引数の型変換ついては「プログラミング言語C++ 第3版」の「11.3.5 コンストラクタと変換」に記載されている。
パフォーマンスに影響がないなら、同じ内容の関数を引数ごとに作るよりも、オブジェクトの自動変換に任せてしまっていいんじゃないの、というところだ。


プログラミング言語C++は、読むのが難しい本だ。
「勉強するんだから原典を読まないと!」と思って買ったものの、詳細がよくわからないときにしか読んでない。
食材買いに出かけるので、本屋に寄ってみましょうかね。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。