2012-04-18 3 views
2

Дано:Compile инициализации время массив с помощью наддува С. & MPL

typedef boost::mpl::vector<Type1, Type2, Type3> types; 
const size_t numTypes = boost::mpl::size<types>::value; 
std::array<std::function<bool(const obj&, const obj&)>, numTypes*numTypes> arr; 

Я пытаюсь получить такого рода функциональность во времени компиляции:

for(size_t i = 0; i < numTypes; ++i) 
{ 
    for(size_t j = 0; j < numTypes; ++j) 
    { 
     arr[i*numTypes+j] = ObjPair<boost::mpl::at_c<vecType, i>::type, boost::mpl::at_c<vecType, j>::type>::Foo; 
    } 
} 

Я думаю, что это будет выглядеть примерно так :

std::array<std::function<bool(const obj&, const obj&)>, numTypes*numTypes> arr = { BOOST_PP_FOR((0, numTypes), PRED, OP, MACRO) }; 

Но я не могу заставить его работать (я не отправлял свою полную неудачную попытку при использовании BOOST_PP_FOR).

ObjPair<T1, T2>::Foo является статическим методом подписи bool(const obj&, const obj&). Он специализируется на разных типах obj.

Я бы использовал этот массив, чтобы найти определенную функцию, заданную парами объектов. Объекты хранятся в качестве базовых классов, и я могу индексировать массив с помощью некоторой математики для определения индекса на основе идентификаторов, доступных в базовом классе.

+1

Для делать это непосредственно в C++ 11 см http://stackoverflow.com/questions/2978259/programmatically-create -static-arrays-at-compile-time-in-c – TemplateRex

ответ

2

Невозможно, чтобы PP перебирал boost::mpl::vector размер. Hovewer вы можете попробовать определить его.

typedef boost::mpl::vector<bool, short, long> vecType; 
#define numTypes 3 

У меня нет TR1, поэтому я стараюсь с массивом повышающего:

typedef boost::function<bool(const obj&, const obj&)> Function; 
typedef boost::array<Function, numTypes*numTypes> FooArray; 

#define OBJPAIR_FOO_ARRAY(z, n, text) BOOST_PP_COMMA_IF(n) &ObjPair<  \ 
boost::mpl::at_c<vecType, n/numTypes>::type, \ 
boost::mpl::at_c<vecType, n%numTypes>::type \ 
    >::Foo 

FooArray fooArray= { 
    BOOST_PP_REPEAT(BOOST_PP_MUL(numTypes, numTypes) , OBJPAIR_FOO_ARRAY,) 
}; 
+0

Спасибо! Как я могу использовать 'boost :: mpl :: size :: value' вместо жестко закодированного' 3' в '#define numTypes 3' - Почему все, кроме целочисленного литерала, вызывает ошибки компиляции? – David

+0

BOOST_PP_REPEAT нужен текст '' 'ведьма приклеена к somthing как' REPEAT_TIMES_3', чтобы развернуть в другой макро как 'REPEAT_TIMES_2'. Ничего, кроме буквального '3', не будет работать. – Arpegius

+0

Есть ли способ использовать BOOST_PP_SLOT вместо 3? Я хочу, чтобы этот код был удаленно отлажен, я даже не могу понять ошибки компиляции. – David

 Смежные вопросы

  • Нет связанных вопросов^_^