2010-01-01 47 views
1

使用boost :: MPL,我可以像如下創建一個三個元素向量的一個typedef:升壓:: MPL的for_each與正常「C」陣列

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」 array而不是std::vector。不幸的是,我不能在這個項目中使用STL容器。

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

我懷疑我需要更換????與另一個綁定條款。有任何想法嗎?

+0

這不應該被標記'C'。 C和C++是不同的語言。 – 2010-01-01 05:03:24

+0

你可以將它重新標記爲Alok。 – 2010-01-01 12:48:18

回答

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

通過引用來取數組會更好,然後讓它衰減到指針,例如, 'template struct foo {int(&arr)[n]; foo(int(&a)[n]):arr(a){}};' – 2010-01-01 13:13:01

0

是的,你的想法是可行的。我輕輕地重寫了它。然而,我想知道的是,如果有一種方法可以使用bind和lambda來實現與inplace函子相同的功能。同時,我會用你的想法。

 
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;