下面的代码将做你想做的事。我做了一些改变。
首先,我pos
用mpl::integral_c
. 通常,在使用 Boost.MPL 时,建议包装所有非类型模板参数。这样,您以后就不必再区分它们了。
其次,我使用了模板元功能转发。这意味着我没有value
在 内部定义模板数据成员,而是从包含该值的 Boost.MPL 模板Sol
派生而来。Sol
这将节省您在整个地方打字::type::value
的时间。使用良好的缩进使代码更易于阅读。
第三,我mpl::plus
用mpl::fold
. boost::mpl::lambda
这对于您提供的代码并不是绝对必要的,但是如果您Sol
在另一个mpl::fold
带有其他占位符参数的表达式中使用它自己(lambda 包装将延迟评估,直到整个模板被解析)。
第四,我做了一个完全专业化来停止你的lev
参数的递归。顺便说一句,如果您开始进行编译时计算 ons 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
{};