3

该算法的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;
4

1 回答 1

4

元函数看起来像fn< iter >::value. 那只是迭代器类型的成员。

直觉上,我会说 member 特定于由find它产生的迭代器或类似的函数。无论如何,正如您所说,它是无证的。不要假设每个迭代器都有一个pos成员。

元函数应该提供这个distance功能,尽管它可能会更慢。

于 2011-04-14T17:27:52.793 回答