2011-04-21 2 views
2
std::string a= "a"; 
std::string b= "b"; 
std::string c= "c"; 

typedef mpl::vector<EasyFixEngineA,EasyFixEngineB,EasyFixEngineC> vecType; 

RegisterInFactory<EasyFixEngine, mpl::at_c<vecType,0>::type> registerA(a); 
RegisterInFactory<EasyFixEngine, mpl::at_c<vecType,1>::type,> registerB(b); 
RegisterInFactory<EasyFixEngine, mpl::at_c<vecType,2>::type> registerC(c); 

어떻게 boost :: mpl을 사용하여 자동으로 마지막 3 줄을 생성 할 수 있습니까? 자동으로 "같은"줄을 3 번 반복하지 않아도됩니다.부스트 mpl 벡터에서 유형 등록

+0

미안 해요 편집했습니다 – Guillaume07

답변

2

하나의 가능성 원하는 거라면하지만 난 잘 모르겠어요 : T의 인스턴스가 귀하의 경우에 적합하지 않은 경우

#include <boost/mpl/vector.hpp> 
#include <boost/mpl/for_each.hpp> 

struct EasyFixEngineA { static const char* const name() { return "a"; } }; 
struct EasyFixEngineB { static const char* const name() { return "b"; } }; 

struct Registrator { 
    template<class T> void operator()(T t) { 
     RegisterInFactory<EasyFixEngine, T> dummy(T::name()); 
    } 
}; 

// ... 
typedef boost::mpl::vector<EasyFixEngineA,EasyFixEngineB> Engines; 
boost::mpl::for_each<Engines>(Registrator()); 

this question를 참조하십시오.

+1

여기에서 펑터 대신 람다 식을 사용할 수 없습니까? – Guillaume07

+1

@Guillaume : 람다를 템플릿으로 만들 수 없으므로 템플릿 멤버 또는 템플릿 함수와 함께 functor를 사용하여'for_each'에서 실제 타입을 가져와야합니다. –

+0

@GeorgFritzsche 더 이상 사실이 아닙니다. C++ 14에는 일반 람다가 추가되었습니다. – CoffeeandCode

1

매우 짧은 대답은 할 수 없다는 것입니다.

사실 세 가지가 있습니다 : - MPL로 컴파일 타임 실행 (일명 메타 프로그래밍). 그들은 단지 형식 정의 작업 - 런타임 실행 (모든 유형이 정의되어 그 시점에서) 일반 C는 (일명 일반적인 프로그래밍.) ++ - 변수 선언

당신은 MPL을 사용하려면을 (컴파일 시간) C++ 코드 (변수 선언)를 생성하고 런타임 (변수 초기화)을 수행합니다.

아마도 boost :: fusion (융합은 컴파일 타임과 런타임 작업을 결합한 것을 의미)을보고 싶을 것입니다. boost :: fusion에 세 개의 변수를 선언하고 세 개의 문자열을 선언하면 boost :: fusion :: transform을 사용할 수 있습니다. 당신이 mpl::for_each을 활용

관련 문제