B級科学者もどきの憂鬱

とある理系になりきれない奴のつれづれなる活動記

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

テンプレートの部分特殊化

TIPSエンジンのC++での組み直しで、
今は高速フーリエ変換の辺りをやっています。

メモリ使用量や計算量の削減のために、
実数型と複素数型で計算ルーチンを変えています。
その辺の関係で、私のコードでは今、テンプレートクラスが大活躍です。

細かい実装は省略しますが、概略はこんな感じ。

/*非複素数型向けの実装*/
template <class DataType=double>
class FFT
{
private:
FFTtable<DataType> table;

public:
bool Prepare(int size) {...}
bool Transform(DataType data[], int size, bool isInverse) {...}
FFT(void) {...}
virtual ~FFT(void) {...}
};

/*複素数型に対する部分特殊化*/
template <class DataType>
class FFT< std::complex<DataType> >
{
private:
FFTtable<DataType> table;

public:
bool Prepare(int size) {...}
bool Transform(std::complex<DataType> data[], int size, bool isInverse) {...}
FFT(void) {...}
virtual ~FFT(void) {...}
};

計算テーブルは型がどちらであろうと変わらないので、
全部別のクラス(FFTtable)にまとめてあります。

複素数には、STLのcomplexクラスを使いました。
いくつか前の記事でComplexクラスを簡易的に実装しましたが、
STLに同じものが存在することに気付いたのはあの後です……orz

計算の実装にはまだ多少無駄があるので、
これからもっと改良していく予定ですが、
とりあえずは動くので、これから次の所を組んでいきます。

後半の部分特殊化の構文ですが、
私はつい最近まで、こんな風に書ける事を知りませんでした。
ポインタ型に使える程度のものだと勝手に思っていたのですが、
もしかしてと調べてみて目的ドンピシャのものが見つかりました。
いやあ、疑ってみるものです。

ただ、個人的には、もっと様々な部分特殊化方法が欲しいです。
例えば、ある基本クラスを継承しているクラスのみに対する部分特殊化とか、
int型テンプレート引数がある数字以上ある数字以下である場合とか。

後者は、C++の文法にちょっと手を加えれば出来そうな気がします。
最近、C++0xの仕様が確定して名前が変わったそうですが、
是非こういう機能を次のバージョンに盛り込んでほしいものです。

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://scientistb.blog42.fc2.com/tb.php/142-165906ca
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。