Является ли MPL pos недокументированной мета-функцией? - PullRequest
3 голосов
/ 14 апреля 2011

В документации 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;

1 Ответ

4 голосов
/ 14 апреля 2011

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

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

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

...