2012-01-26 17 views
3

効率的な数値処理のためのライブラリを作成しています。私はdoublecomplex、あるいはcustom_matrixの多種多様な数字をサポートしなければなりません。パフォーマンス上の理由から、コンパイラは算術演算と関数呼び出しに積極的な最適化を使用できるように、数値型ごとに別々のライブラリファイルをコンパイルすることに決めました。今度は、パラメータnumber_typeを持つテンプレートクラスを作成するためのオプションが2つあります。C++ - テンプレートとtypedefベースのクラス階層

template <typename valueType> 
class Worker { 
    valueType process(valueType value); 
}; 

またはtypedefプロジェクトワイドヘッダファイルの番号種別。

in 'project.hpp': 

namespace myProject { 
    typedef double valueType; 
} 

in 'worker.hpp': 

#include "project.hpp" 

namespace myProject { 
    class Worker { 
     valueType process(valueType value); 
    }; 
} 

個人的に私はどちらかの方法を受け入れることができない:テンプレートベースのコードが冗長templatetypenameキーワードのトンと非常識な私を運転している、一方のtypedefベースのコードは、単一のライブラリファイルにコンパイルすることはできません(リンクが失敗しました名前が重複しているため)、1つのプログラムで異なる番号タイプを使用することはできません。

質問には次のようなものがあります。私は何か不足していますか?私の仕事を達成するためのより良い/よりクリーンな方法がありますか?

編集:doubleコードとcomplexコードを1つのアプリケーションで同時に使用する必要があります。

EDIT2:わかりやすく言うと、iOSアプリケーション用の算術式解析エンジンを開発しています。したがって、私はC/C++/Objective-Cに限られており、パフォーマンスが重要です。

また、一般的な状況ではテンプレートを使用するのが快適です。私の状況では、私のすべてのソースファイルは山括弧とtemplate/typenameのキーワードでいっぱいです。それは単に迷惑であり、重要な文章を書くことから私をそらす。

私は、私が見る限り、よりよい解決策がないので、テンプレートを使用すると思います。

+0

あなたがC++を使ってはならないよりも、テンプレートを「受け入れる」ことができないならば。 – ildjarn

答えて

2

テンプレートを使用する必要があります。実行時ではなくコンパイル時に最大限の作業を行うことを強くお勧めし、選択した言語がC++の場合は、テンプレートプログラミングを使用します。

エラーメッセージが混乱し、メッセージが混乱し、typenameキーワードが表示されます(ヘッダーにクラス全体を定義したくない場合は、明示的なインスタンス化を開始しないでください! )しかし、それは我々が持っている混乱です。

EDIT:前処理の形式で3番目のオプションがあります。プリプロセッサで同じコードを2回実行し、別の名前空間にシンボルを置くと、typedefと同じ効果が得られますシンボルの衝突。

+1

閉じる>>> >>> ... – Stu

+0

@Stu:プリプロセッサ展開された名前と組み合わせて、ソースコードを見るときに '>>'に気付かないこともあります。 .. – Borealid

+0

AAAAH!やめる!悪い酸のような初期のスピリットライブラリのフラッシュバック!そして、なぜ私は生産コードのためにC++を拒否するのだろうか... ... – Stu

4

C++の人々は、あなたのコードがというコードが実際にとなることを尋ねることなく、templateを使用するように指示します。

ここで重要な質問は、あなたのライブラリーは2種類の異なる番号タイプと同時に使用されますか

答えが「いいえ」の場合、テンプレートは恐ろしい選択です。あなたがよく知っているように、テンプレートは使いやすいものではありません。彼らはあなたの仕事を増やし、コンパイラの作業量は増えますし、IDEで解析してオートコンプリートを実現しようとします。

グローバルtypedefを使用してください。あなたは長期的に頭痛の種をたくさん節約します。ところで、this is exactly what the Bullet physics library does

+0

はい、1つのアプリケーションで 'double'と' complex'を使う必要があります。さもなければ、あなたが提案したように 'typedef'に固執し、オブジェクトファイルを分離するためにライブラリをコンパイルします。 – UncleAli

1

本当に良い方法はありません。あなたが与えられたプログラムで1つ以上のタイプを使う必要があるならば、基本的には行く方法はtemplatesです。あなたがこのような場合には十分であり、読み込み/デバッグが容易であるため、決して起こらないと確信が持てば、typedefsと進みます。

もちろん、テンプレートを十分に書いておくと、厳密に必要ではない場合でも、それらを使用するポイントまで自然になることがあります(問題を解決する他の合理的な方法があるように)。少なくとも私に起こったこと

関連する問題