2017-08-16 58 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()];