2012-02-07 48 views
1

我正在做一個項目,將使用數學計算很多。我也希望能夠簡單地改變實數的實現。讓我們來說說float,double,我自己的實現和gmplib浮點類型。如何在C++中輕鬆轉換算法?

到目前爲止,我thouht的方法有兩種:

  1. 我創建一個類「數字」,這將與程序的REST接口。

  2. 我的typedef算術類型和寫入全局的功能與程序的其他部分相連接。

第一個選擇似乎更優雅,但第二個似乎有更少的開銷。有第三個更好的選擇嗎?另外我擔心的是基本的數學函數,例如正弦,餘弦,exp ...我發現爲了簡化切換,我應該將它們實現爲模板,但是我的實現速度很慢。

我一般都不熟悉C++編程。我被帶到了舒適的Matlab和Mathematica環境中,在那裏我不必擔心這種事情。

+1

對於我的錢來說,模板聽起來很自然。 – NPE 2012-02-07 08:42:26

+0

模板!您可以在不事先知道涉及的類型的情況下定義函數。 – 2012-02-07 08:46:37

回答

1

模板是我這樣做的方式。它可以很容易地專門化必須專門化的東西,並且提供了一種重用實現時適用於多種類型的好方法。

號碼類型可以做到的,但它實際上不是簡單的做對,並介紹了一些限制(與模板相比較)。

多種類型的只是絕望複雜的,如果你想甚至接近快速,準確,並易於維護的東西。如果您要創建全局的typedef,那麼您可能最終會使用模板來正確實施這些模板。

模板提供了所有的力量,控制和靈活性,你需要,以及(如果你使出...模板技術,#2能夠以最快的速度),他們會比公佈的方案更快。

1

類似實數的模板類應該適合您。因爲您可以重載所需的功能,並在需要時使用模板專業化。

爲了提高效率,使用STL算法代替手寫循環。

好運

1

這兩種選擇都在封裝方面等同的:有會在你的程序的單點,你將不得不更改號碼類型,而這一變化將影響你的整個程序。如果提供這兩種選擇,請選擇typedef;它不那麼優雅(=>更簡單,更簡單更好)並且具有相同的能力。

當你得到更舒適的使用C++,模板化的功能將是更好的選擇,因爲數量型的確定可以本地製造的,而不是全局。使用模板,您可以確定實例化點(最有可能是呼叫站點)的數字類型,從而提供更大的靈活性。但是,模板中存在許多缺陷,我建議您先使用C++多一點經驗,然後開始模板化。

3

您將需要使用帶約束的模板以避免重新實現。

例如,假設您想在程序中使用sin,對於floatdouble不同。您可以根據類型重載並創建專門的模板。

template<class T> T MySin(const T& f) { 
    return genericSin(f); 
} 

template<> float MySin<float>(float f) { 
    return sinf(f); 
} 

template<> double MySin<double>(double d) { 
    return sin(d); 
} 

對於功能。如果您想要執行OO路由,則在部分專門化Math類時,語法類似。這將使您可以調用任何類型的例程,並擁有最專業和最高效的例程。

+0

+1好的建議和一個很好的例子。值得指出的是,這與Number類型或typedef一起工作,並沒有解決問題的這一部分。我建議'MySin(const T&f)'作爲一些'T'值可能是大對象。 – 2012-02-07 09:06:41

+0

@TonyDelroy好點!我會編輯答案 – Dervall 2012-02-07 09:11:26

相關問題