[英]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高效……因此,以下准則:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.