1

私は次のプライマリテンプレートを持っています:

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ました。この場合、私はおそらくこの折り畳みを省略して、値を4と6の他の2つのSol構造体の1レベル低い値の合計であると宣言することができることを知っています。入力するのに少し時間がかかったpos場合に備えて修理しましたか?vector_c

ありがとう..

4

1 に答える 1

1

以下のコードはあなたが望むことをします。いくつか変更を加えました。

まず、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
{};
于 2012-08-07T19:08:53.273 に答える