Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;boost-mpl向量_C++_Templates - Fatal编程技术网

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开发者:)