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;
}
どうもありがとうございました!