1

boost::mpl を使用すると、次のような 3 要素ベクトルの typedef を作成できます。

typedef boost::mpl::vector_c<int,1,2,3> height_t;

次のスニピットを使用して、この typedef から値を引き出すことができます。

std::vector<int> height;
boost::mpl::for_each<height_t>(boost::bind(&std::vector<int>::push_back, &height, _1));   

assert(height[0] == 1);
assert(height[1] == 2);
assert(height[2] == 3);

これと同じことを行う方法があるかどうか疑問に思っていますが、. の代わりに通常の 'C' 配列を使用しstd::vectorます。残念ながら、このプロジェクトでは STL コンテナーを使用できません。

uint32_t height[3];
boost::mpl::for_each<height_t>(????, &height, _1));    

???? を交換する必要があると思います。別の bind 句を使用します。何か案は?

4

2 に答える 2

2

次のようなものを試してください

 struct foo { 
     int c;
     int* arr;
     template<class U> 
     void operator(U& u) { arr[c++] = u; }
     foo(int a*) : c(0), arr(a) {}
 };

 for_each<height_t>(foo(height));
于 2010-01-01T03:41:09.257 に答える
0

はい、あなたのアイデアはうまくいくでしょう。ざっくり書き直しました。しかし、私が疑問に思っているのは、バインドとラムダを使用して、インプレース ファンクターでこれと同じことを行う方法があるかどうかです。それまでの間、私はあなたのアイデアを使用します。

テンプレート <typename type_t>
構造体 static_assign
{
    type_t* a;
    static_assign(type_t* a) : a(a) {}

    template<typename T>
    void operator()(T t)
    {
        *a++ = t;
    }
};

uint32_t color[MAX_COLORS];
uint32_t* pcolor = (uint32_t*)&color;
boost::mpl::for_each<typename static_color<scheme_t>::type>(static_assign<uint32_t>(pcolor));
pcolor += インジケータ;

于 2010-01-03T02:23:40.083 に答える