4

mpl::vectoraを実行した後に a のオフセットを取得することは可能mpl::find<seq,type>ですか?

別の言い方をすれば、次のコンパイル時間に相当するものを実行したいと考えています。

#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
  typedef std::vector<int> v_type;
  v_type v_int(3);

  v_int[0] = 1;
  v_int[1] = 2;
  v_int[2] = 3;

  v_type::iterator it= std::find(  v_int.begin() ,v_int.end(),3);

  std::cout << it - v_int.begin() << std::endl;
}

これに失敗すると、私の型にmpl::vectortype_trait<T>::ordinalconst がハードコーディングされています。可能であればこれを避けたいと思います。

重要な注意、私はboost::variantベクトルからも作成しています。ランタイム関数を実行することで序数を取得できることがわかりますvariant::which()。ただし、これには、デフォルトで初期化された値でダミー オブジェクトを作成する必要があります。これはかなり醜いです。バリアントでそれを行う他の方法を知っていれば、それも私の問題の解決策になります。

4

2 に答える 2

3

あなたが探しているのが一種の indexOf 機能である場合、Boost.MPL doc に関する例でうまくfindいくと思います。

typedef vector<char,int,unsigned,long,unsigned long> types;
typedef find<types,unsigned>::type iter;

BOOST_MPL_ASSERT(( is_same< deref<iter>::type, unsigned > ));
BOOST_MPL_ASSERT_RELATION( iter::pos::value, ==, 2 );
于 2011-05-18T11:47:24.117 に答える
1

それらは、まさにこれを行うイテレータ カテゴリのメタ関数であり、 distanceと呼ばれます。

ps、自分の質問にすぐに答えてしまったことをお詫びします。私はちょうど解決策に出くわしました。

于 2011-05-18T11:45:35.867 に答える