MPL是否是一个无证的元函数?

时间:2011-04-14 16:25:02

标签: c++ boost find position boost-mpl

BOOST MPL documentation of the find algorithm中有以下示例代码:

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 个答案:

答案 0 :(得分:4)

元功能看起来像fn< iter >::value。这只是迭代器类型的一个成员。

从本质上讲,我会说该成员特定于find或类似函数产生的迭代器。无论如何,正如你所说,它是无证的。不要假设每个迭代器都有pos成员。

distance元函数应提供此功能,但可能会更慢。