boost :: mpl :: vectorの各クラスにクラスフレンドを設定するにはどうすればよいですか?つまり、次のように拡張されます。
template <typename mpl_vector>
class A {
friend class mpl_vector[0];
friend class mpl_vector[1];
...
friend class mpl_vector[n];
};
Andresが提案するように、ブーストプリプロセッサでそれを行うとうまくいきます。
私はそれを試してみましたが、うまくいかず、コンパイルが非効率的です。また、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
このファイルにはそれ自体が含まれているため、必ずビット内のファイルと同じ名前を付けてください。
さらに、このコードにより、クラス「ダミー」が「A」のフレンドになります。
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;
};