2017-08-16 28 views
1

我想使用静态数组,其大小需要根据给定的模板值来确定。不过,程序运行时间的大小将保持不变 - 这就是为什么我决定不使用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。任何建议,欢迎和赞赏。

+3

错误消息告诉您的问题 - 你的阵列size不是一个整数,它是一个不带参数并返回int的lambda。 – Chowlett

回答

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

+0

事实上,它的工作原理,谢谢:)看来我试图太聪明。 – 412131

2

如上所述here,lambda表达式可以并不是constexpr,你只能声明一个数组的大小,其值为constexpr(甚至是t母鸡,你不是试图调用声明的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()];