2010-10-01 5 views
0

Я начал играть с ускорителем и mpl-библиотекой и застрял в довольно простой проблеме.Получение индекса boost :: fusion :: vector from boost :: mpl :: vector

Я объявил следующие типы:

typedef boost::mpl::vector<char, int, long> TypeVector; 
typedef boost::fusion::vector<char, int, long> FusionVector_t; 

Теперь я хотел бы написать функцию, которая получает мне значение от FusionVector.

template<size_t N typename T> 
T getValue(FusionVector_t fvec) 
{ 
    return boost::fusion::at_c<N>(fvec); 
} 

Функция работает, как ожидалось, но я хотел бы получить индекс от вектора повышение :: MPL и использовать его в этой функции и не передать его в функцию в качестве параметра шаблона. Но я пока не понял, как это сделать.

Может ли кто-нибудь дать мне подсказку?

ответ

1

Вы можете использовать алгоритм поиска, чтобы получить «итератор», указывающий на первое появление типа в последовательности MPL. Что-то вроде:

typedef boost::mpl::find<TypeVector, T>::type MplIter; 

, а затем запросить вектор слияния в этой позиции «итератор» 's:

return boost::fusion::at_c<MplIter::pos::value>(fvec); 

Однако, я не понимаю, почему вы используете вектор MPL на всех. IIUC, вы хотите, чтобы определить ПолучитьЗначение как:

template<class T> 
T getValue(FusionVector_t fvec) 
{ 
    typedef boost::mpl::find<TypeVector, T>::type MplIter; 
    return boost::fusion::at_c<MplIter::pos::value>(fvec); 
} 

, который может работать только тогда, когда TypeVector и FusionVector_t «содержат» ту же последовательность типов. В таком случае, почему бы не использовать только FusionVector_t и написать:

template<class T> 
T getValue(FusionVector_t fvec) 
{ 
    return *boost::fusion::find<T>(fvec); 
} 

Кроме того, если вы хотите использовать «T» в качестве «индекса» в последовательности Fusion, это имеет смысл только, если данный тип появляется только один раз в последовательности. Таким образом, fusion :: set будет казаться более подходящим, чем вектор. В этом случае у вас будет:

typedef boost::fusion::set<char, int, long> FusionSet_t; 

template<class T> 
T getValue(FusionSet_t fset) 
{ 
    return boost::fusion::at_key<T>(fset); 
} 
+0

Спасибо за отзыв. MPL и вектор слияния одинаковы. Но ваш подход кажется намного чище, чем мой. Также причина для использования fusion :: vector заключалась в том, что я пришел из библиотеки кортежей. Но я буду придерживаться вашего предложения. большое спасибо – mkaes