부스트 MPL과 퓨전을 사용하여 Java와 유사한 주석 시스템을 구현하려고합니다.C++ 컴파일시 클래스 멤버 var에
왜 필요합니까 : 몇 가지 특별한 런타임 기능을 사용하려면 var 멤버에 주석을 달아야합니다.
class foo
{
INIT()
$REGISTER("test1")
int test1 = 5;
$REGISTER("b")
char* b = "rndmText";
....
}
내 목표는 포인터의 조합 $ REGISTER 같은 텍스트입니다 (& A, "A")하지만 미래 목표입니다 : 내가 이렇게 내 기본 clase에 컴파일 시간에 그들을 시도 등록합니다. ..
기본 클래스는 필요한 모든 것을 처리합니다.
#define INIT() \
typedef boost::fusion::vector0<> BOOST_PP_CAT(registered, BOOST_PP_SUB(__COUNTER__,2)); \
boost::fusion::vector0<> BOOST_PP_CAT(list,BOOST_PP_SUB(__COUNTER__,2));
#define EXPORT(arg) \
typedef boost::fusion::result_of::push_back< BOOST_PP_CAT(registered, BOOST_PP_SUB(__COUNTER__,4)), const char*>::type BOOST_PP_CAT(registered, __COUNTER__); \
BOOST_PP_CAT(registered, BOOST_PP_DEC(__COUNTER__)) BOOST_PP_CAT(list, BOOST_PP_SUB(__COUNTER__,1)) = boost::fusion::make_list(BOOST_PP_CAT(list,BOOST_PP_SUB(__COUNTER__,7)), arg);
이 (내 경우) 확장에 : 레지스터 매크로는 융합 벡터 생성
typedef boost::fusion::vector0<> registered18;
boost::fusion::vector0<> list19;;
typedef boost::fusion::result_of::push_back< registered18, const char*>::type registered23;
registered23 list24 = boost::fusion::make_list(list19, "test1");;
int test1 = 5;
typedef boost::fusion::result_of::push_back< registered23, const char*>::type registered28;
registered28 list29 = boost::fusion::make_list(list24, "b");;
char* b = "rndmText";;
을 그리고 여기에 문제가 : 부스트 :: 융합 :: make_list은 (... , "test1") 컴파일러 오류를 만들고 그것을 수정하는 방법을 모르겠습니다. 이것은 오류입니다 :
boost::fusion::joint_view<Sequence,const boost::fusion::single_view<const char *>>::joint_view(const boost::fusion::joint_view<Sequence,const boost::fusion::single_view<const char *>> &)' : cannot convert argument 1 from 'boost::fusion::list<T,const char (&)[6],boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_,boost::fusion::void_>' to 'const boost::fusion::joint_view<Sequence,const boost::fusion::single_view<const char *>> &'
누군가 저를 도울 수 있습니까? 아니면 더 좋은 생각이 있습니까?
도미니크
이것은 내 첫 번째 (게시되지 않은) 솔루션과 매우 비슷합니다. 매크로를 사용하여 가독성을 높이기 위해 클래스 멤버 선언과 가까운 레지스터 함수를 이동 시키길 바랍니다. – Matyro
@Matyro : 고귀한 목표처럼 들리지만, 당신이 썼던 매크로가 가독성에 도움이되지는 않는다고 생각합니다. –
배경 소스는 덜 중요한 사람들을위한 것으로, 앞면이 잘 보일 것입니다 : p – Matyro