C ++的朋友们在boost :: mpl :: vector中的每个类

时间:2012-08-28 16:36:01

标签: c++ boost

如何在boost :: mpl :: vector中为每个类都有一个类朋友?即,扩展到:

的东西
template <typename mpl_vector>
class A {
    friend class mpl_vector[0];
    friend class mpl_vector[1];
    ...
    friend class mpl_vector[n];
};

2 个答案:

答案 0 :(得分:3)

按照Andres的建议,使用boost预处理程序可以正常工作。

我试了一下,这样做并不好,编译效率很低。它也仅限于处理BOOST_MPL_LIMIT_VECTOR_SIZE。如果他的方法有效,那么它可能会更清洁。

classA.h:

#if BOOST_PP_IS_ITERATING
friend get_elem<mpl_vector, BOOST_PP_ITERATION()>::type;
#else
#ifndef SOME_INCLUSION_GUARD_H
#define SOME_INCLUSION_GUARD_H

#include <boost/preprocessor/iteration/iterate.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/size.hpp>

class Dummy {};
template <int Exists> struct get_elem_i {
    template <typename V, int N> struct get {
        //typedef Dummy type;
        typedef typename boost::mpl::at< V, boost::mpl::int_<N> >::type type;
    };
};
template <> struct get_elem_i<0> {
    template <typename V, int N> struct get {
        typedef Dummy type;
    };
};

template <typename V, int N> struct get_elem {
    typedef typename boost::mpl::size<V>::type size;
    typedef get_elem_i<N < size::value> elem;
    typedef typename elem::get<V, N>::type type;
    //typedef Dummy type;
};

template <typename mpl_vector>
class A {

#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_MPL_LIMIT_VECTOR_SIZE, "classA.h"))
??=include BOOST_PP_ITERATE()

private:
    int test_;
};

#endif // SOME_INCLUSION_GUARD_H
#endif

此文件包含自身,因此请确保与BOOST_PP_ITERATION_PARAMS_1位中的文件同名。

此外,此代码还会使“Dummy”类成为“A”的朋友。

答案 1 :(得分:2)

我认为您需要使用Boost.Preprocessor或Pump之类的东西来专门化您的模板以获得不同大小的MPL向量。或者只是手动专门化。

您必须通过以下方式专门化您的模板:

template< typename mpl_vector, std::size_t size = boost::mpl::size< mpl_vector >::type::value >
class A;

template< typename mpl_vector >
class A< mpl_vector, 0 >
{
};

template< typename mpl_vector >
class A< mpl_vector, 1 >
{
    friend class boost::mpl::at< mpl_vector, boost::mpl::int_< 0 > >::type;
};