C ++ Boost MPL вектор - PullRequest
       1

C ++ Boost MPL вектор

1 голос
/ 04 июня 2010

Я понимаю, что следующий код не будет работать, так как я - параметр времени выполнения, а не параметр времени компиляции. Но я хочу знать, есть ли способ добиться того же. у меня есть список классов, и мне нужно вызвать функцию шаблона с каждым из этих классов.

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 и использовать тип для вызова глобальной функции, а затем использовать этот параметр для выполнения некоторых операций времени выполнения.

Спасибо заранее, Gokul.

Рабочий код

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 ]

3 голосов
/ 04 июня 2010

Вы можете сделать i константой времени компиляции и использовать рекурсию шаблона для перебора классов.

3 голосов
/ 04 июня 2010

Я использовал MPL только для набора типов для BOOST_AUTO_TEST_CASE_TEMPLATE, поэтому мои знания весьма ограничены. Однако, я думаю, вы могли бы использовать for_each для итерации последовательности MPL.

0 голосов
/ 05 июня 2010

К сожалению, вы часто обнаружите, что MPL не очень удобен, когда дело доходит до перехода от мира времени компиляции к миру времени выполнения.

Для этого есть библиотека Boost: Boost.Fusion, цель которой состоит в том, чтобы более точно смешивать программирование метатемплат и время выполнения.

Если вы прочитаете документацию, вы поймете, что они не стесняются MPL, а скорее опираются на него. Авторы даже признают, что их последовательности не так эффективны в операциях во время компиляции, как MPL ... таким образом, следующее руководство:

  • Вычисление во время компиляции: используйте MPL
  • Нужна последовательность во время выполнения? Как только вы вычислили его через MPL, конвертируйте его в Fusion.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...