2015-05-03 65 views
0

我實施的功能如下:是否所有類型都擴展了在C++ 11標準中實現FENV所需的std :: is_floating_point?

template <typename FP> 
void do_something(FP f){ 
    static_assert(std::is_floating_point<FP>::value, "not a floating point"); 
    ... 
} 

在這種情況下,任何浮點可以使用(天然的或定製的,即多精度浮點庫)。

我想知道標準是否說明了什麼期望重載is_floating_point的類型。我可以指望他們需要與FENV合作嗎?

如果自定義浮點實現重載std :: is_floating_point,我可以假設以下代碼應該正常工作嗎?

template <typename FP> 
void do_something(FP f){ 
    static_assert(std::is_floating_point<FP>::value, "not a floating point"); 
    if (std::fetestexcept(FE_DIVBYZERO)){ 
     ... 
    } 
} 
+0

你確定專門化is_floating_point除float/double/long double之外的任何東西都合法嗎? –

+0

在這一點上並不確定。 – dvicino

回答

2

沒有沒有這樣的事,作爲一個「自定義浮點型」,就std::is_floating_point而言。

20.10.4.1/1主要類型類別對應於C++標準的第3.9節中給出的描述。

表47 - 主型類別謂詞 template <class T> struct is_floating_point;T是一個浮點類型(3.9.1)

3.9.1/8有三種浮點類型floatdouble,和long double

17.6.4.2.1/1 C++程序的行爲,如果其添加聲明或定義到命名空間std或命名空間內std一個命名空間,除非另有規定未定義。只有當聲明依賴於用戶定義類型並且專業化符合原始模板的標準庫要求並且沒有明確禁止時,程序可以將任何標準庫模板的模板專用化添加到名稱空間std

+1

[meta.type.synop]/p1:「除非另行指定,否則未定義爲本子條款中定義的任何類模板添加專業化程序的行爲。」 –

相關問題