Вы можете использовать алгоритм поиска, чтобы получить итератор, указывающий на первое вхождение типа в последовательности MPL.Что-то вроде:
typedef boost::mpl::find<TypeVector, T>::type MplIter;
, а затем запросить вектор слияния в позиции этого «итератора»:
return boost::fusion::at_c<MplIter::pos::value>(fvec);
Однако я не понимаю, почему вы используете вектор MPL ввсе.IIUC, вы хотели бы определить getValue как:
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);
}