ページ 11

継承かメンバ関数か

Posted: 2010年9月03日(金) 07:02
by ぬっち
お世話になっております。

現在私は、テンプレートクラスとして3次元のベクトルクラス(STLではなく、数学のベクトル)を作成しています。
そこで、皆様の意見を頂きたいと思いましたので投稿させていただきます。

この3次元ベクトルクラスは、メンバ関数としてベクトルの回転を含んでいます。
ですが、これは右手系と左手系では関数の内部が変わってしまいます。
従って、私は両方の系に対応するために、

1. 回転を含まない3次元ベクトルクラスから、右手系・左手系専用のベクトルクラスを作成する。
2. 3次元ベクトルクラスに左手系・右手系用のメンバ関数を両方とも作成する。
3. 回転というメンバ関数に、左手系か右手系かを表すフラグを引数に取らせて、関数内部でそれぞれの処理を行うようわける。

ということを考えました。

このクラスは何度も呼び出されるため、出来るだけ実行速度を速くしたいと考えています。
これ以外の方法でも構いませんので、どのような方法がよいか意見を頂けないでしょうか?
よろしくお願いします。

Re:継承かメンバ関数か

Posted: 2010年9月03日(金) 07:50
by めるぽん
単純に考えるなら、使う側に対して、
型を書くときに右手系か左手系かを決定させたいなら1、
使うときに右手系か左手系かを決定させたいなら2か3ですね。

Re:継承かメンバ関数か

Posted: 2010年9月03日(金) 08:00
by たいちう
本当に実行速度が大事ならば、3種類作ってみて、実行速度を比較してください。
私の予想だと有意な差は見られないと思います。

それと、回転が右手系・左手系を持つのでしょうか?
ベクトルが右手系・左手系を持つのでしょうか?
それとも、一連の計算が全て右手系(あるいは)左手系で行われるのでしょうか?
回転毎に右手系・左手系を定義するのではないならば、
「回転というメンバ関数に、左手系か右手系かを表すフラグを引数に取らせて」というのは、
設計的にどうかと思います。

ソースコードを見せてもらえれば、より具体的なアドバイスが増えると思いますよ。

Re:継承かメンバ関数か

Posted: 2010年9月03日(金) 08:05
by たいちう
補足

有意な差が無いだろうという予想の根拠ですが、
回転の計算に必要な浮動小数点数(整数かも)の演算に必要な処理時間と比較して、
系の判定に必要な処理時間は無視できると思われるからです。

あくまでも予想・憶測ですが。

Re:継承かメンバ関数か

Posted: 2010年9月03日(金) 11:06
by たかぎ
右手系か左手系かをテンプレート引数で指定すれば速度は低下しません。

Re:継承かメンバ関数か

Posted: 2010年9月03日(金) 20:05
by ぬっち
めるぽんさん、たいちうさん、たかぎさん返信ありがとうございます。

いろいろ考えた結果、2の方法で行うことにします。
さまざまなコメントをしていただきありがとうございます。

ところでたかぎさんのテンプレート引数による右手系・左手系の作成をする方法がいまだによくわからないので、このあたりをもう少し考えてみることにします。
Strategyパターンのことなのでしょうか?

Re:継承かメンバ関数か

Posted: 2010年9月03日(金) 20:56
by たかぎ
> ところでたかぎさんのテンプレート引数による右手系・左手系の作成をする方法がいまだによくわからないので、このあたりをもう少し考えてみることにします。
> Strategyパターンのことなのでしょうか?

Strategyパターンにできなくもないでしょうが、もっと単純な話です。

例えば、int func() という関数があった場合、

func<LH>() または func<RH>() のように、左手系か右手系かをテンプレート引数で与えればよいということです。
動的に左手系か右手系かを切り替えなければならないケースはそうないはずですので、これなら、どちらを選択するかはコンパイル時に決定され、(選択にかかる)実行時のコストはまったくありません。

Re:継承かメンバ関数か

Posted: 2010年9月04日(土) 20:23
by ぬっち
たかぎさん返信ありがとうございます。

テンプレート引数でコンパイル時に条件分岐するということですね。
この方法は試したことがないので試してみようかと思います。

貴重なコメントありがとうございました。