4

私は持っている

mpl::vector_c<int, 0, 1, 2, 3, 4, 5>

30 に設定したいとします。したがって、メタ関数を作成してインデックス、ベクトル、新しい値を取得し、変更されたシーケンスを返す必要があります。私は次の解決策で終わった

template <int k, class sequence, class value>
class assign_element
{
            typedef typename mpl::begin<sequence>::type begin;
            typedef typename mpl::advance<begin, mpl::int_<k> >::type pos;
            typedef typename mpl::erase <sequence, pos>::type sequence2;

            typedef typename mpl::begin<sequence2>::type begin2;
            typedef typename mpl::advance<begin2, mpl::int_<k> >::type pos2;
public:
            typedef typename mpl::insert <sequence2, pos2, value>::type type;
};

そして、私はそれを次のように使用します

typedef mpl::vector_c<int, 0, 1, 2, 3, 4, 5> sequence;
typedef typename assign_element<3, sequence, mpl::int_<30> >::type result;

このソリューションは機能しますが、ご覧のとおり、非常に複雑です (反復子、進行などを含む)。このユースケースに対して、よりシンプルでおそらく効率的な解決策はありますか? 前もって感謝します!

4

1 に答える 1

2

私は MPL を使用したことはありませんが、非常に興味深いようで、ドキュメントを確認します。ここに私の3つの答えがあります。これがお役に立てば幸いです:

1) 間違った答え - しかし、正しい答えを見つけるための良いスタートかもしれません。replace_if の使用を検討しますか?

typedef vector_c<int, 0, 1, 2, 3, 4, 5> sequence;
typedef replace_if< numbers, equal_to<_,int_<3> >, int_<30> >::type result;

at_pos<3> 述語が必要です。私はそのようなものを見つけませんでした、

2) あなたの答えは正しいです。カプセル化したので、使用法は 1 行です。そして、簡単さについて話すときは使用法が重要です - 実装ではありません。たぶんあなたの assign_element<> は mpl::insert<> から派生するのでしょうか? または、C++ 11 の方法で "using" を使用して typedef を削除することを検討してください...

3) この最後の回答をお勧めします: MPL 作成者に replace_at と呼ばれるものを追加するよう依頼してください...

HTH、ピョートル・ニッチ

于 2012-06-23T14:33:42.583 に答える