boost :: mpl :: vector - получение базового смещения типа - PullRequest
4 голосов
/ 18 мая 2011

Можно ли получить смещение mpl::vector после выполнения на нем 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::vector имеют жестко запрограммированный константный type_trait<T>::ordinal, и я хотел бы избежать этого, если это возможно.

Важное примечание , я также создаю boost::variant из вектора и вижу, что могу получить порядковый номер, выполнив функцию времени выполнения variant::which(). Однако для этого необходимо создать фиктивный объект с инициализированными по умолчанию значениями. Это довольно некрасиво. Если вы знаете какой-то другой способ сделать это с вариантом, это также решило бы мою проблему.

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Если то, что вы ищете, является своего рода функцией indexOf, я думаю, пример из документа Boost.MPL относительно 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 );
1 голос
/ 18 мая 2011

Это метафункция в категории itterator, для этого она называется distance .

p.s., Извиняюсь за быстрый ответ на свой вопрос. Я просто наткнулся на решение.

...