C++ 11で、私は私が値でブースト::配列の内容を初期化したいコピーMPL :: vector_c、コンパイル時に静的な配列へ
#include <boost/mpl/vector_c.hpp>
#include <boost/mpl/size.hpp>
#include <boost/array.hpp>
#include <iostream>
namespace mpl = boost::mpl;
template<std::size_t ... Args>
struct Test
{
typedef mpl::vector_c<std::size_t, Args ...> values_type;
static const boost::array<std::size_t, sizeof...(Args)> values;
};
int main (int argc, char** argv)
{
Test<3,2,5,6,7> test;
return 0;
}
のようなものは、「含まれる」を持ちますmpl :: vector_cに入れてください。この初期化は、コンパイル時に実行する必要があります。私はプリプロセッサを使っていくつかの解決策を見てきましたが、私はvariadicテンプレートの場合にそれらをどのように適用するかについて考えていません。
上記のサンプルコードでは、mpl :: vector_cの要素はTestのテンプレートパラメータと同じであることに注意してください。実際のコードでは、ではなく、values_type
の長さはテンプレート引数の数になりますが、実際の値はmplアルゴリズムのシーケンスを適用した結果になります。したがって、引数が同じであると仮定しないでください。
質問がクリアなので、ありがとう!
私は 'に比べてどんな利点があるかどうかについての単なる好奇心for(size_t s:{3、2、5、6、7}) '? – betabandido
@betabandido:いいえ、どちらも同じアセンブリにコンパイルされます(もちろん最適化後)。 – kennytm
しかし、テンプレートメタプログラミングのより複雑な使い方では、質問とあなたのソリューションに示されているアプローチが実際には必要かもしれないと思いますよね?例えば、私は配列をある関数から別の関数に渡す必要がある状況を考えています。その場合でもプレーンな配列({3,2、...})を使うことは可能でしょうか? – betabandido