2

constexpr可変個引数テンプレートパラメータを使用して生成されたパターンで配列を初期化したいと思います。簡単にするために、constexpr unsignedタイプのリストのサイズで静的配列を初期化する問題を考えてみましょうunsigned, short, char, int, longコンパイル時にすべての計算が行われるようにするには、どうすればよいですか?C ++型システムでうまく機能するソリューションが必要なので、マクロを使用できません。

私が思いついた最善の方法を以下に示しますが、(g ++ 4.7を使用した)コンパイルg++ -std=c++11 -Wall -Ofast -Sとアセンブリの検査により、実行時に値がスタックにプッシュされていることが明らかになります。何か案は? 正常に動作します

配列初期化子を次のように使用すると、拡張n+1について拡張nについて何らかの方法で伝えることができれば機能します。

static constexpr unsigned foo[] = { compute_element<Args>::value... };

編集:待って、気にしないでください、私は頭脳を持っていました。上記の行は正常に機能します...

これがコードの答えです:

#include <iostream>

template <class... Args>
struct foo
{
    static constexpr unsigned bar[] = { sizeof(Args)... };
};

int main()
{
    std::cout << foo<unsigned, short, char, int, long>::bar[2] << std::endl;
    return 0;
}

どうもありがとうございました!

4

1 に答える 1

5

これが答えです。C ++の制限により、これはコンパイル時にのみ実行でき、可変個引数テンプレートパラメータパックと同じサイズの配列を作成できることを覚えておいてください。

#include <iostream>

template <class... Args>
struct foo
{
    static constexpr unsigned bar[] = { sizeof(Args)... };
};

int main()
{
    std::cout << foo<unsigned, short, char, int, long>::bar[2] << std::endl;
    return 0;
}
于 2012-07-16T20:21:33.920 に答える