是否可以在函数范围内声明/实现模板?

时间:2015-02-07 14:02:38

标签: c++ templates

标题==问题。

非常具体,是否可以像这样实现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>();
    }
}

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

2 个答案:

答案 0 :(得分:2)

  

是否可以在函数范围内声明/实现模板?

没有。 [温度] / P2:

  

template-declaration 只能作为命名空间范围或类范围声明出现。

以免你认为这允许本地类中的模板声明,[temp.mem] / p2:

  

非闭包类型的本地类不应具有成员模板。

您的代码还存在各种其他问题,其中两个问题在Mike Seymour的回答中有所提及。

虽然sinh之类的东西可以作为constexpr函数实现,但如果参数是常量表达式,则允许在编译时进行评估。

答案 1 :(得分:1)

有两个问题:

  • 模板参数不能有浮点类型
  • 模板参数必须是常量表达式,这会排除函数参数。
  • 函数定义只能在命名空间范围内。如果你想让它因某些原因无法访问,你可以将它变为lambda或本地类的成员。