我尝试使用静态数组,其大小需要由给定的模板值确定。但是程序运行时间的大小将保持不变 - 这就是我决定不使用defaultdict
的原因。
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; }; ];
};
是常量静态值。 IDE给了我一个提示
数组大小表达式必须具有整数类型而不是int(*)()
我想知道如果不使用FOO_EGDE
我是否可以这样做。任何建议都受到欢迎和赞赏。
答案 0 :(得分:3)
问题是,您使用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;
}
答案 1 :(得分:2)
正如here所描述的那样,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 ()];