【问题标题】:Static array size determined from template values由模板值确定的静态数组大小
【发布时间】:2018-01-24 06:50:51
【问题描述】:

我正在尝试使用需要由给定模板值确定大小的静态数组。然而,大小在程序运行时将保持不变——这就是我决定不使用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 是 const 静态值。 IDE 给了我一个提示

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

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

【问题讨论】:

  • 错误消息告诉您问题所在 - 您的数组大小不是整数,它是一个不带参数并返回 int 的 lambda。

标签: c++ c++11


【解决方案1】:

正如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 ()];

【讨论】:

    【解决方案2】:

    问题是,您使用 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

    【讨论】:

    • 确实有效,谢谢 :) 看来我太聪明了。
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2014-07-21
    • 2011-01-23
    • 2017-06-20
    • 2018-01-23
    • 1970-01-01
    • 2012-05-04
    相关资源
    最近更新 更多