使用boost pp&编译数组的时间初始化MPL

时间:2012-04-18 20:40:38

标签: c++ boost boost-mpl boost-preprocessor

假设:

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类型。

我将使用此数组来查找给定对象的特定函数。这些对象作为基类保存,我可以使用一些数学索引数组,以根据基类中可用的ID确定索引。

1 个答案:

答案 0 :(得分:2)

PP无法迭代boost::mpl::vector大小。您可以尝试定义它。

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

我没有TR1所以我尝试使用boost数组:

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