簡體   English   中英

C ++ Boost mpl矢量

[英]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;
}

我只將MPL用於BOOST_AUTO_TEST_CASE_TEMPLATE的類型BOOST_AUTO_TEST_CASE_TEMPLATE ,所以我的知識非常有限。 但是,我猜您可以使用for_each遍歷MPL序列。

您可以使i成為編譯時間常數,並使用模板遞歸迭代類。

毫無疑問,當涉及到從編譯時世界過渡到運行時世界時,MPL並不是很方便。

為此有一個Boost庫:Boost.Fusion,其目的是更輕松地將元模板編程和運行時混合在一起。

如果您通讀了文檔,您會發現他們對MPL並不害羞,而是在此基礎上繼續前進。 作者甚至承認,它們的序列在編譯時操作中不如MPL高效……因此,以下准則:

  • 編譯時計算:使用MPL
  • 在運行時需要序列嗎? 通過MPL計算完后,請將其轉換為Fusion 1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM