C++ 数组作为非类型模板参数

C++ 数组作为非类型模板参数,c++,arrays,templates,C++,Arrays,Templates,我注意到 template <size_t n, char[n]> class x { }; 所以我想知道:我该如何用这个模板来创建一个类呢?模板类x template <size_t n, char[n]> class x { }; char foobar[]="hey"; x<4, foobar> y; { }; char foobar[]=“嘿”; xy; 使用gcc 5.3.1进行编译 #include <iostream> t

我注意到

template <size_t n, char[n]> class x
{
};
所以我想知道:我该如何用这个模板来创建一个类呢?

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

char foobar[]="hey";

x<4, foobar> y;
{ }; char foobar[]=“嘿”; xy;
使用gcc 5.3.1进行编译

#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;
}

潜在的缓冲区溢出问题。

我猜该参数需要有链接。我猜您的编译器将字符串“hey”视为常量字符*而不是字符[],如果您说
x某物,我不认为编译器会在这里强制执行类型安全。我不知道
X
char-hey[]=“hey”之间有什么区别;X
。有没有办法使用更紧凑的表示法,类似于
“hey”
版本?简而言之,字符串文字没有链接,甚至没有名称。当前标准不支持这种表示法。
template <size_t n, char[n]> class x
{
};

char foobar[]="hey";

x<4, foobar> y;
#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<5, hey> something;