2017-08-16 3 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は、私はそれがstd::vectorを使用せずにこのように動作させることができる場合、私は疑問に思う私に

配列サイズの式(*)の代わりにint型の整数型を持たなければならないというヒント()

を与えます。アドバイスは歓迎され、評価されます。

+3

エラーメッセージあなたの問題を言っている - あなたの配列sizeは整数ではなく、引数を取らずに 'int'を返すラムダです。 – Chowlett

答えて

2

問題は、配列のサイズを決定するためにラムダを使用していることです。あなたはそれを残して、ちょうど三項演算子を使用している場合は、それが動作します:

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説明し、ラムダ式のことが可能配列はconstexprでなければならず、配列のサイズはconstexprの値で宣言できます(t hen、宣言されたラムダを呼び出すことを試みていません(宣言の最後に()が必要です)。

、このような問題を回避するには、プライベート静的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()]; 
関連する問題