Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

推測返回值的類型(Calculation of the Type of the Result)

這個庫中的所有的函數都被重載用於接受混合的浮點類型(或者混合的整型和浮點類型)參數。例如:

foo(1.0, 2.0);
foo(1.0f, 2);
foo(1.0, 2L);

只要"foo"是一個帶有兩個浮點參數的函數,上面的調用都是合法的調用。但這會產生一個問題。

如果所有的參數的類型是相同的(浮點類型)類型,那麼返回值的類型與參數的類型一樣。

否則,返回值的類型使用下面的方法來推測:

  1. 任何的非模板參數都從接下來的分析中排除。
  2. 對於參數參數中的每種類型,如果它為整型,那麼為了滿足下面分析的目的,它被當作double類型來看待。
  3. 如果任何一個類型為用戶自定義類型,那麼返回值的類型是其它的參數可以構造的類型。(If any of the arguments is a user-defined class type, then the result type is the first such class type that is constructible from all of the other argument types)。
  4. 如果任何一個參數類型為long double,那麼結果類型為long double
  5. 如果任何一個參數類型為double,那麼結果類型為double
  6. 否則返回值類型為float

例如:

cyl_bessel(2, 3.0);

返回一個 double 結果:

cyl_bessel(2, 3.0f);

在這種情況下,整數首先當作double處理,並且優先級比第二個float參數高。為了得到一個float類型結果,我們需要所有的參數都為float類型:

cyl_bessel_j(2.0f, 3.0f);

當有一個或多個參數不是模板參數時,那麼它不會對結果類型產生影響:

sph_bessel(2, 3.0f);

返回float ,因為第一個參數不是模板參數,所以它不影響結果類型:如果沒有這個規則,那麼帶有整型參數的函數永遠都不能返回float類型。

對於用戶自定義類型,下面的所有調用都返回 NTL::RR 類型結果:

cyl_bessel_j(0, NTL::RR(2));

cyl_bessel_j(NTL::RR(2), 3);

cyl_bessel_j(NTL::quad_float(2), NTL::RR(3));

在最後一種情況中, quad_float 可以轉化為 RR類型,但反過來卻不可以,因此結果為 NTL::RR類型。注意,假定我們在使用patched NTL library.

選擇這些規則是為了與ISO/IEC 9899:1999 Programming languages - CDraft Technical Report on C++ Library Extensions, 2005-06-24, section 5.2.1, paragraph 5相兼容。


PrevUpHomeNext