2015-02-07 96 views
-3

標題==問題。是否可以在函數範圍內聲明/實現模板?

具體來說,是否有可能像這樣實現std :: sinh?

namespace std { 
    long double sinh(const long double arg) { 
     template <long double _arg> long double _sinh() { 
      // sinh implementaion here 
     } 
     template <> long double _sinh<0>() {return 0;} 
     template <> long double _sinh<-0>() {return -0;} 
     template <> long double _sinh<INFINITY>() {return INFINITY;} 
     template <> long double _sinh<-INFINITY>() {return -INFINITY;} 
     return _sinh<arg>(); 
    } 
} 

我知道,這是一個愚蠢的想法,但我真的很好奇。

+5

這是錯誤的幾種方法 – Columbo 2015-02-07 14:04:21

+0

我知道,我在幾秒鐘前發生錯字。 – 2015-02-07 14:05:13

+0

'namestace'是最好的一個 – Shoe 2015-02-07 14:07:11

回答

2

是否可以在函數範圍內聲明/實現模板?

號公報[溫度]/P2:

模板聲明只能出現作爲命名空間範圍或類範圍的聲明。

而且免得你覺得這允許本地類中的模板聲明,[temp.mem]/P2:

局部類非閉合型的,不得有成員模板。

您的代碼還有其他各種問題,其中兩個在Mike Seymour的答案中提到。

雖然像sinh這樣的東西很可能被實現爲constexpr函數,如果參數是一個常量表達式,允許在編譯時進行評估。

1

有兩個三個問題:

  • 模板PARAMATERS不能有浮點型
  • 模板參數必須是常量表達式,這就排除了函數的參數。
  • 函數定義只能在命名空間範圍內。如果由於某種原因想要使其無法訪問,則可以將其設置爲lambda或本地類的成員。
+0

在模板中有非類型參數是可能的,但是,我同意const long雙重參數不是一個常量表達式。 – 2015-02-07 14:08:13

+0

- 在'std'命名空間中聲明事物可能會導致UB – Shoe 2015-02-07 14:08:18

+0

@DannyuNDos:但不可能具有浮點類型的非類型參數。 – 2015-02-07 14:09:02