使用 MPL::fold 与占位符和我自己的结构错误



我有以下主模板:

template<size_t pos, size_t lev>
struct Sol;

我专门针对一些 pos 值,如下所示:

template<size_t lev>
struct Sol<0, lev>
{
    static const mpl::vector_c<size_t, 4, 6> jumps;
    static const size_t value =
        mpl::fold<jumps, mpl::integral_c<size_t, 0>, 
                  mpl::plus<Sol<_1, lev-1>::value, 
                            Sol<_2, lev-1>::value> >::type::value;
}

但我明白Sol预期的size_t并得到了mpl_::_1.我知道在这种情况下,我可能会省略我试图做的这个折叠事情,只是声明值是其他Sol两个结构的一个级别较低值的总和,用于 4 和 6 的 pos.但我想知道这是否可以修复以防vector_c有点长?

谢谢。。

下面的

代码将做你想要的。我做了一些更改。

首先,我用 mpl::integral_c 包装了pos类型模板参数。通常,在使用 Boost.MPL 时,建议包装所有非类型模板参数。这样,您以后就不必区分它们。

其次,我使用了模板元函数转发。这意味着我不是在Sol内部定义模板数据成员value,而是简单地从包含该值的 Boost.MPL 模板派生Sol。这将节省您到处打字::type::value。使用良好的缩进使代码更易于阅读。

第三,我用boost::mpl::lambda把你对mpl::plus的电话包裹在mpl::fold里面。这对于您提供的代码来说并不是绝对必要的,但如果您在另一个mpl::fold表达式中与其他占位符参数一起使用Sol本身(lambda 包装将延迟评估,直到整个模板被解析)。

第四,我做了一个完整的专门化来停止对你的lev参数的递归。顺便说一句,如果您开始对 lev 进行编译时计算,同样的建议适用:首先将其包装成mpl::integral_c

#include <boost/mpl/fold.hpp>
#include <boost/mpl/integral_c.hpp>
#include <boost/mpl/lambda.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/plus.hpp>
#include <boost/mpl/vector_c.hpp>
namespace mpl = boost::mpl;
using namespace mpl::placeholders;
// primary template
template<typename pos, size_t lev>
struct Sol;
// partial specialization for zero position
template<size_t lev>
struct Sol< mpl::integral_c<size_t, 0>, lev>
:
        mpl::fold<
                mpl::vector_c<size_t, 4, 6>, 
                mpl::integral_c<size_t, 0>,
                mpl::lambda<
                        mpl::plus<
                                Sol<_1, lev-1>, 
                                Sol<_2, lev-1>
                        > 
                > 
        >        
{};
// full specialization for zero position and level
template<>
struct Sol< boost::mpl::integral_c<size_t, 0>, 0>
:
        boost::mpl::integral_c<size_t, 0> // or whatever else you need
{};

相关内容

最新更新