以下のコードはあなたが望むことをします。いくつか変更を加えました。
まず、pos
型以外のテンプレートパラメータを。でラップしましたmpl::integral_c
。一般に、Boost.MPLを使用する場合は、型以外のすべてのテンプレートパラメーターをラップすることをお勧めします。このように、後でそれらを区別する必要はありません。
次に、テンプレートメタ関数転送を使用しました。value
これが意味するのは、内部でテンプレートデータメンバーを定義する代わりに、その値を含むBoost.MPLテンプレートからSol
単純に派生するということです。Sol
これにより、あちこちで入力する手間が省けます::type::value
。コードを読みやすくするために、適切なインデントを使用してください。
第三に、私はあなたの呼び出しをmpl::plus
内側にラップmpl::fold
しましたboost::mpl::lambda
。これは、指定したコードでは厳密には必要ありませんが、他のプレースホルダー引数を使用Sol
して別の式内でそれ自体を使用する場合は必要になりmpl::fold
ます(ラムダラッピングは、テンプレート全体が解析されるまで評価を遅らせます)。
lev
第4に、パラメーターの再帰を停止するために完全に特殊化しました。ところで、コンパイル時の計算を開始する場合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
{};