根据模板值确定的静态数组大小

Static array size determined from template values

本文关键字:静态 数组      更新时间:2023-10-16

我正在尝试使用静态数组,其大小需要由给定的模板值确定。但是,大小在整个程序运行时将是恒定的 - 这就是我决定不使用std::vector的原因。

template<uint32_t BAR_WIDTH>
class Bar 
{
//do_stuff...
Foo mapper[ [&]()->int{ uint32_t tmp = BAR_WIDTH / Foo:FOO_EDGE; return (BAR_WIDTH % 10 == 0) ? tmp : tmp + 1; }; ];
};

FOO_EGDE是常量静态值。IDE给了我一个提示

数组大小表达式必须具有整数类型而不是 int(*(((

我想知道我是否可以在不使用std::vector的情况下让它以这种方式工作.欢迎和赞赏任何建议。

问题是,您正在使用 lambda 来确定数组的大小。如果您将其关闭并仅使用三元运算符,则可以:

int main() {
const bool z = true;
const int x = 5, y = 3;
int arr[z ? x : y];
return 0;
}

艾德酮

与以下相反:

int main() {
const bool z = true;
const int x = 5, y = 3;
int arr[[&]() -> int { return z ? x : y; }];
return 0;
}

艾德酮

如此处所述,lambda 表达式还不能constexpr,您只能声明具有constexpr值的数组的大小(即使这样,您也不会尝试调用声明的 lambda(调用它 - 声明结束时需要()(。

若要解决此问题,可以使用私有静态constexpr方法,并将其返回值用于数组大小声明:

static constexpr uint32_t GetArraySize ()
{
uint32_t tmp = BAR_WIDTH / Foo::FOO_EDGE;
return (BAR_WIDTH % 10 == 0) ? tmp : tmp + 1;
}
Foo mapper[GetArraySize ()];