2010-06-04 99 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版本。