2010-06-04 78 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并使用该类型来调用全局函数,然后使用该参数来执行一些运行时操作。

在此先感谢, 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

我只用了MPL的类型BOOST_AUTO_TEST_CASE_TEMPLATE的集合,所以我的知识是相当有限的。但是,我猜你可以使用for_each来遍历MPL序列。

+0

谢谢。有效。 – Gokul 2010-06-04 20:25:20

3

您可以让i编译时间常数,并使用template recursion遍历类。

+0

这也适用于我。仍然想遵循事物的推动方式。谢谢, – Gokul 2010-06-04 20:24:32

+0

在这里也是一样,但我根本不知道MPL。我曾经是Loki的开发者,但是:) – 2010-06-04 22:18:29

0

幸运的是,您经常会发现,从编译时间世界到运行时间世界的交叉时,MPL并不是非常方便。

这里有一个Boost库:Boost.Fusion,其目的正是为了更简单地混合metatemplate编程和运行时。

如果你仔细阅读文档,你会发现它们不会害怕MPL,而是建立在它之上。作者甚至承认,他们的顺序是不能编译时操作作为有效的MPL的...因此以下方针:

  • 编译时计算:使用MPL
  • 需要在序列运行 ?一旦你通过MPL计算出来,将其转换为Fusion版本。