静态数组大小由模板值确定

时间:2017-08-16 08:06:45

标签: c++ c++11

我尝试使用静态数组,其大小需要由给定的模板值确定。但是程序运行时间的大小将保持不变 - 这就是我决定不使用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我是否可以这样做。任何建议都受到欢迎和赞赏。

2 个答案:

答案 0 :(得分:3)

问题是,您使用lambda来确定数组的大小。如果你把它关掉并且只使用三元运算符,它就可以工作:

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

Ideone

相反:

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

Ideone

答案 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 ()];