【问题标题】:C++ boost mpl vectorC++ boost mpl向量
【发布时间】:2010-06-04 19:19:04
【问题描述】:

我了解以下代码不起作用,因为 i 是运行时参数而不是编译时参数。但我想知道,是否有办法实现同样的目标。我有一个类列表,我需要为每个类调用一个模板函数。

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

提前致谢, 悟空。

工作代码

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;
}

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    我只将 MPL 用于BOOST_AUTO_TEST_CASE_TEMPLATE 的类型集合,所以我的知识非常有限。不过,我猜您可以使用 for_each 来遍历 MPL 序列。

    【讨论】:

      【解决方案2】:

      您可以将i 设为编译时常量并使用template recursion 来遍历类。

      【讨论】:

      • 这也对我有用。仍然想遵循升压的方式。谢谢,
      • 这里也一样,但我根本不知道 MPL。不过我曾经是 Loki 开发人员 :)
      【解决方案3】:

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

      为此有一个 Boost 库:Boost.Fusion,其目的正是为了更轻松地混合元模板编程和运行时。

      如果您通读文档,您会发现他们并没有回避 MPL,而是在此基础上进行构建。作者甚至承认,他们的序列在编译时操作中不如 MPL 的高效......因此以下指南:

      • 编译时计算:使用 MPL
      • 在运行时需要序列吗?通过 MPL 计算后,将其转换为 Fusion。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多