C++ C++;boost-mpl向量
我知道下面的代码不起作用,因为我是一个运行时参数,而不是编译时参数。但我想知道,是否有办法实现同样的目标。我有一个类列表,我需要调用一个模板函数,每个类C++ C++;boost-mpl向量,c++,templates,C++,Templates,我知道下面的代码不起作用,因为我是一个运行时参数,而不是编译时参数。但我想知道,是否有办法实现同样的目标。我有一个类列表,我需要调用一个模板函数,每个类 void GucTable::refreshSessionParams() { typedef boost::mpl::vector< SessionXactDetails, SessionSchemaInfo > SessionParams; for( int i = 0; i < boost::m
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);
}
}
void
GucTable::refreshSessionParams()
{
typedef boost::mpl::vectorSessionParams;
对于(int i=0;i();
sparam->updateFromGucTable(此);
}
}
有人能给我一个简单而优雅的方法来完成同样的任务吗?我需要遍历mpl::vector并使用该类型调用一个全局函数,然后使用该参数执行一些运行时操作
提前感谢,,
戈库尔
工作代码
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;
}
typedef boost::mpl::vectorSessionParams;
类GUCSession迭代器
{
私人:
GucTable&m_表;
公众:
GUCSession迭代器(GucTable和table)
:m_表(表)
{
}
模板void运算符()(常量U&)
{
g_getSessionParam()->updateFromGucTable(m_表);
}
};
无效的
GucTable::refreshSessionParams()
{
boost::mpl::for_each(GucSessionIterator(*this));
返回;
}
我只将MPL用于BOOST\u AUTO\u TEST\u CASE\u模板的类型集合,因此我的知识非常有限。但是,我想您可以使用MPL序列进行迭代。我只将MPL用于BOOST\u AUTO\u TEST\u CASE\u模板的类型集合
,因此我的知识非常有限。然而,我想你可以用它来迭代一个MPL序列。你可以把I
作为一个编译时常量,然后用它来迭代类。你可以把I
作为一个编译时常量,然后用它来迭代类。毫无疑问,你经常会发现MPL在使用时并不方便从编译时世界过渡到运行时世界
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);
}
}
为此有一个Boost库:Boost.Fusion,其目的就是更容易地混合元模板编程和运行时
如果您通读了这些文档,您会意识到他们并不回避MPL,而是基于MPL构建。作者甚至承认,他们的序列在编译时操作中的效率不如MPL序列。。。因此,应遵循以下准则:
- 编译时计算:使用MPL
- 运行时需要序列吗?通过MPL计算后,将其转换为融合
令人遗憾的是,当MPL从编译时世界过渡到运行时世界时,您经常会发现它并不十分方便
为此有一个Boost库:Boost.Fusion,其目的就是更容易地混合元模板编程和运行时
如果您通读了这些文档,您会意识到他们并不回避MPL,而是基于MPL构建。作者甚至承认,他们的序列在编译时操作中的效率不如MPL序列。。。因此,应遵循以下准则:
- 编译时计算:使用MPL
- 运行时需要序列吗?通过MPL计算后,将其转换为融合
这也适用于我。仍然想跟随事情的发展方向。谢谢,我也是,但我一点也不懂MPL。我曾经是一个Loki开发者:)这对我来说也很有用。仍然想跟随事情的发展方向。谢谢,我也是,但我一点也不懂MPL。我曾经是一名Loki开发者:)