模板函数中的类型相关常量

pir*_*iri 6 c++ arrays templates template-specialization

我想在模板化函数中使用静态数组,其长度取决于函数专用的类型.我的第一次尝试是:

标题:

template<typename T>
struct Length {
    const static size_t len;
};

template<typename T>
void func(){
  static T vars[Length<T>::len]; // len not const. according to compiler!
  // ...
}
Run Code Online (Sandbox Code Playgroud)

源文件:

template<> const size_t Length<double>::len = 2;
template<> const size_t Length<float>::len = 1;
// ...
Run Code Online (Sandbox Code Playgroud)

但是,g++不编译这个并抱怨

错误:'vars'的存储大小不是常数

那么问题到底是什么?我知道固定长度数组的大小需要是一个常量并且在编译时已知,但这似乎就是这种情况.当我写作

const size_t len = 2;

void func(){
    static double vars[len];
}
Run Code Online (Sandbox Code Playgroud)

它编译没有问题.

题:

代码有什么问题,有哪些替代方案可以实现所需的行为?我不想在运行时分配内存...

Rei*_*ica 5

要使const变量被视为编译时常量(正式地,常量表达式),其值必须在使用时可用.这意味着专用定义必须转到头文件.

如果只是作为成员的特化完成,就像你一样,我认为这会给你一个多重定义错误.你应该没关系整个类模板,并保持静态成员定义内联:

template<typename T>
struct Length;

template <>
struct Length<double>
{
  static const size_t len = 2;
};
Run Code Online (Sandbox Code Playgroud)

作为旁注,您的程序最初是无效的:必须在使用前声明显式特化.这意味着你必须至少申报的专业化len的头部(或无处不在,你打算使用它).