通常,适配器的目的是以修改的格式进行函数调用.有没有办法为成员变量做同样的事情?也就是说,我有一个包含a的对象SomePoint
和另一个包含a的对象DifferentPoint
.SomePoint
其存储的数据作为成员变量资本X
和Y
地方AnotherPoint
将其存储的数据作为成员变量小写x
和x
.所以问题是你不能编写一个接受a SomePoint
或a 的函数,DifferentPoint
因为你无法访问.x
或者.X
(甚至使用模板而没有完全专门针对每个不同的点类型,在这种情况下你可能只是在点上重载类型).
现在的问题是有没有一种方法,使这将产生一个适配器.X
的SomePoint
时候.x
请求?这两种点类型都是库类,所以我不能直接编辑任何一个的内部.我还想避免复制数据.
通常的方法是编写一个traits类来指定如何获取所需的数据.
这是使用指向成员的可能实现.如果您愿意,可以将它们变成函数或lambdas.
templatestruct PointTraits; template <> struct PointTraits { constexpr static auto getX = &SomePoint::x; constexpr static auto getY = &SomePoint::y; }; template <> struct PointTraits { constexpr static auto getX = &AnotherPoint::X; constexpr static auto getY = &AnotherPoint::Y; };
然后你会像这样使用它:
templatevoid printX (const PointT& point) { std::cout << point.*PointTraits ::getX; }