Является ли MPL pos недокументированной метафункцией?

В документации BOOST MPL есть следующий пример кода. алгоритма find:

typedef vector<char,int,unsigned,long,unsigned long> types;
typedef find<types,unsigned>::type iter;
...
BOOST_MPL_ASSERT_RELATION( iter::pos::value, ==, 2 );

Однако я не могу найти документацию по метафункции pos итератора. Могу ли я использовать его надежно?

Я хотел бы использовать его как-то как:

typedef vector<type1, type2, type3> types;

template <typename T>
void File::write(T value) {
    BOOST_MPL_ASSERT((contains<types, T>));
    unsigned typeID = find<types, T>::type::pos::value;
    fstr << typeID << value;
}

для хранения информации о типе в файле вместе с самим значением.

ИЗМЕНИТЬ

Спасибо Potatoswatter за ответ, похоже, это решение работает:

template <typename S, typename T>
struct pos : distance< typename begin<S>::type, typename find<S, T>::type >
{};

...
    unsigned typeID = pos<types, T>::value;

person Daniel Langr    schedule 14.04.2011    source источник


Ответы (1)


Метафункции выглядят как fn< iter >::value. Это просто член типа итератора.

Интуитивно я бы сказал, что этот член специфичен для итераторов, полученных из find или подобных функций. В любом случае, как вы говорите, это недокументировано. Не думайте, что каждый итератор имеет член pos.

Метафункция distance должна обеспечивать эту функциональность, хотя она может быть медленнее.

person Potatoswatter    schedule 14.04.2011