2015-02-07 97 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