我正在应用boost multi_index示例的示例6。
  https://www.boost.org/doc/libs/1_71_0/libs/multi_index/doc/examples.html#example6

我仍在学习密钥提取的语法。我发现member密钥提取器的第三个参数需要一个指向class类型为type的成员的指针,其中class是第一个arg,类型是第二个arg。

template<class Class,typename Type,Type Class::*PtrToMember>
struct member;


但是在示例6中,作者使用了第三个arg,它不是指针.....

key_from_key<
  member<car_manufacturer,
         const std::string,
         &car_manufacturer::name>,
  member<car_model,
         const car_manufacturer *,
         car_model::manufacturer> >


这应该是&来创建指向类型为car_model的类const car_manufacturer *的成员的指针,所以给我们pointer to pointer .....但是他只使用成员标识符car_model::manufacturer,该标识符仅指向会员。
那么,为什么作者在第三个论点中省略了&呢?

如果需要更多代码,我会把它放进去。

最佳答案

恭喜,您在Boost.MultiIndex docs中发现错误:-)

如您正确指出的,它应该是&car_model::manufacturer而不是car_model::manufacturer。而且,car_model::manufacturer甚至不是合法的C ++,因为它将声明对成员的引用,即does not exist in the language

此外,文档说:

struct car_model
{
  std::string       model;
  car_manufacturer* manufacturer;
  int               price;
};


应该在哪里(正确地写在实际代码中):

struct car_model
{
  std::string             model;
  const car_manufacturer* manufacturer;
  int                     price;
};


否则,member<car_model,const car_manufacturer *,&car_model::manufacturer>将与manufacturer成员的类型不匹配。

我将在文档中修复所有这些问题。感谢您发现混乱。

关于c++ - 使用自定义键提取器语法问题的boost::multi_index?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58919665/

10-11 16:17