数组作为非类型模板参数

时间:2016-06-07 23:02:05

标签: c++ arrays templates

我注意到了

template <size_t n, char[n]> class x
{
};

很高兴被我的C ++编译器接受。但是,当我天真地尝试像

这样的东西时
x <4, "hey"> something;

我得到了一个很好的

Non type template argument does not refer to any declaration

所以我想知道:我怎样才能真正用这个模板制作课程?

2 个答案:

答案 0 :(得分:2)

#include <iostream>

template <size_t n, char s[n]>
class X {
public:
  X() {
    std::cout << s;
    std::cout << std::endl;
  }
};

char hey[] = "hey";

int main() {
  X<4, hey> x;
}

但是X<4, "hey"> x;不能编译,因为对于非类型模板参数,某些限制适用:

  

对于指向对象的指针,模板参数必须指定   具有静态存储持续时间和链接的对象的地址   (内部或外部),或评估的常量表达式   到适当的空指针或std :: nullptr_t值。

这引发了另一个问题,我在cppreference.com上找到了以下内容:

  

数组和函数类型可以写在模板声明中,但是   它们会被指向对象和指针的指针自动替换   功能酌情。

所以s实际上是一个指针,因此下面将编译:

X<5, hey> something;

潜在的缓冲区溢出问题。

答案 1 :(得分:0)

template <size_t n, char[n]> class x
{
};

char foobar[]="hey";

x<4, foobar> y;

使用gcc 5.3.1编译