コンパイラ屋さんが頑張っています。boost屋さんも頑張っています
#include <iostream> #include <boost/preprocessor/repetition/repeat.hpp> #include <boost/preprocessor/arithmetic/add.hpp> #include <boost/preprocessor/cat.hpp> #include <boost/preprocessor/stringize.hpp> #define TEST_MAX 229 #define MAX_CLASS BOOST_PP_CAT(A, TEST_MAX) struct MAX_CLASS; struct A0 { static MAX_CLASS* a_first; MAX_CLASS const& operator->() const; int i; }; #define DECL_CLASS_TEST(n, prev)\ struct BOOST_PP_CAT(A,n)\ {\ BOOST_PP_CAT(A,prev) a_;\ BOOST_PP_CAT(A,prev) const & operator->() const {\ std::cout\ << BOOST_PP_STRINGIZE(BOOST_PP_CAT(A,n))\ << std::endl;\ return a_;\ }\ int i;\ }; #define INVOKER(_1, n, _2) \ DECL_CLASS_TEST(BOOST_PP_ADD(n, 1), n) BOOST_PP_REPEAT(TEST_MAX, INVOKER, mmm) #define MAX_An BOOST_PP_CAT(A, TEST_MAX) MAX_CLASS* A0::a_first; MAX_CLASS const& A0::operator->() const { std::cout << "A0" << std::endl; return *a_first; } int main() { MAX_An max_; A0::a_first = &max_; max_->i; }
こんなんでもちゃんと循環参照を発見してくれるコンパイラ屋さん。いつもありがとう。
2百何十回ものリピートを書けるようにしてくれたboost屋さん、いつもありがとう。
Visual Studio2008 SP1 + boost 1.42でTEST_MAXは228まででした。
MinGW gcc4.5.0でTEST_MAXは256まででした。(←BOOST_PP_LIMIT_REPEATかな)
実際上、これだけ使えたら十分ですね。