2010-06-04 7 views
1

나는 런타임 매개 변수이며 컴파일 타임 매개 변수가 아니므로 다음 코드는 작동하지 않는다는 것을 알고 있습니다. 그러나 나는 같은 것을 성취 할 수있는 방법이 있는지 알고 싶습니다. 나는 클래스 목록을 가지고 있으며, 나는이 클래스들 각각과 함께 템플릿 함수를 호출해야한다.C++ boost mpl vector

void 
GucTable::refreshSessionParams() 
{ 
    typedef boost::mpl::vector< SessionXactDetails, SessionSchemaInfo > SessionParams; 
    for(int i = 0; i < boost::mpl::size<SessionParams>::value; ++i) 
     boost::mpl::at<SessionParams, i>::type* sparam = 
         g_getSessionParam< boost::mpl::at<SessionParams, i>::type >(); 
     sparam->updateFromGucTable(this); 
    } 
} 

누구도 나에게 쉽고 우아한 방법을 제안 할 수 있습니까? mpl :: vector를 반복하고 전역 함수를 호출 한 다음 해당 매개 변수를 사용하여 런타임 작업을 수행해야합니다.

미리 감사드립니다. 고쿨.

난 단지 BOOST_AUTO_TEST_CASE_TEMPLATE에 대한 유형의 컬렉션에 대한 MPL을 사용

typedef boost::mpl::vector< SessionXactDetails, SessionSchemaInfo > SessionParams; 

class GucSessionIterator 
{ 
private: 
    GucTable& m_table; 

public: 
    GucSessionIterator(GucTable& table) 
     :m_table(table) 
    { 
    } 

    template< typename U > void operator()(const U&) 
    { 
     g_getSessionParam<U>()->updateFromGucTable(m_table); 
    } 
}; 


void 
GucTable::refreshSessionParams() 
{ 
    boost::mpl::for_each<SessionParams>(GucSessionIterator(*this)); 
    return; 
} 

답변

3

작동 코드는, 그래서 내 지식은 매우 제한적이다. 그러나 나는 for_each을 사용하여 MPL 시퀀스를 반복 할 수 있다고 생각합니다.

+0

감사합니다. 그것은 효과가 있었다. – Gokul

3

i을 컴파일 시간 상수로 만들 수 있으며 template recursion을 사용하여 클래스를 반복 할 수 있습니다.

+0

이것은 또한 나를 위해 일했습니다. 여전히 사물의 부스트 방법을 따르고 싶었습니다. 고마워, – Gokul

+0

예치 여기에 있지만 MPL 전혀 몰라. 나는 Loki 개발자가 되곤했다 :) –

0

언젠가 MPL이 컴파일 타임 세계에서 런타임 세계로 크로스 오버 할 때 정말로 편리하지 않다는 것을 종종 알게 될 것입니다.

Boost.Fusion,이 목적은 메타 패턴 프로그래밍과 런타임을 더 쉽게 섞어주는 것입니다.

설명서를 읽으면 MPL을 부끄러워하지 않고 그것을 구현할 수 있다는 것을 알게 될 것입니다. 저자는 그들의 순서는 컴파일 시간 운영에 효율적 아니라는 것을 인정하는, 따라서 MPL 것들 ... 다음 가이드 라인 :

  • 컴파일 시간 계산 :에서 순서가 필요한 MPL
  • 를 사용 런타임? MPL을 통해 계산하면 Fusion으로 변환하십시오.
관련 문제