2010-01-01 5 views
1

Utiliser boost :: mpl, je peux créer un typedef d'un vecteur à trois éléments comme suit:boost :: mpl for_each avec Array normal 'C'

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

je peux tirer les valeurs de ce typedef avec la snippit suivante:

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); 

Je me demande s'il y a un moyen de faire la même chose mais avec un tableau « C » normale au lieu d'un std::vector. Malheureusement, je ne peux pas utiliser les conteneurs STL dans ce projet.

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

Je soupçonne que j'ai besoin de remplacer le ???? avec une autre clause de liaison. Des idées?

+0

Ceci ne doit pas être étiqueté 'C'. C et C++ sont des langues différentes. –

+0

Vous pouvez retag it Alok. –

Répondre

2

Essayez quelque chose comme

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)); 
+0

Prendre le tableau par référence serait mieux alors le laisser se désintégrer en un pointeur, par ex. 'modèle struct foo {int (& arr) [n]; foo (int (& a) [n]): arr (a) {}}; ' –

0

Oui, votre idée fonctionnerait. Je l'ai réécrit légèrement. Cependant, ce que je me demande c'est s'il y a un moyen de faire la même chose avec un foncteur in-situ, en utilisant bind et lambda. En attendant, je vais utiliser votre idée.

 
template <typename type_t> 
struct 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 += indicator; 

Questions connexes