c++ - "Adapter"为成员变量

标签 c++ adapter

通常,适配器的目的是以修改后的格式进行函数调用。有没有办法对成员变量做同样的事情?也就是说,假设我有一个包含 SomePoint 的对象和另一个包含 DifferentPoint 的对象。 SomePoint 将其数据存储为大写的成员变量 XY 其中 AnotherPoint 将其数据存储为小写的成员变量 xx。所以问题是你不能写一个接受 SomePointDifferentPoint 的函数,因为你不能访问 .x.X(即使使用模板而不完全专门针对每个不同的点类型,在这种情况下,您也可以只重载点类型)。

问题是有没有一种方法可以让适配器在请求 .x 时为 SomePoint 生成 .X?这两种点类型都是库类,所以我不能直接编辑其中任何一种的内部结构。我还想避免复制数据。

最佳答案

通常的做法是写一个 traits 类来指定如何取出你想要的数据。

这是使用指向成员的指针的可能实现。如果愿意,您可以将它们变成函数或 lambda。

template <typename T>
struct PointTraits;

template <>
struct PointTraits<SomePoint> {
    constexpr static auto getX = &SomePoint::x;
    constexpr static auto getY = &SomePoint::y;
};

template <>
struct PointTraits<AnotherPoint> {
    constexpr static auto getX = &AnotherPoint::X;
    constexpr static auto getY = &AnotherPoint::Y;
};

然后你会像这样使用它:

template <typename PointT>
void printX (const PointT& point) {
    std::cout << point.*PointTraits<T>::getX;
}

关于c++ - "Adapter"为成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34725228/

相关文章:

java - 未调用 RecyclerView 适配器方法

c++ - QSqlQuery 行影响结果

c++ - Xcode 7 : C++ threads ERROR: Attempting to use a deleted function

c++ - boost 字符串的分配性能

c++ - 选择哪个 Visual C/C++ 运行时库?

android - ViewPager 使用 fragment 更新屏幕外 View 而不是主视图

c++ - 在 C++ 中使用 union 时是否可以跳过字节?

adapter - 使用无线适配器 Windows 7 的网桥

android - [Android]ListView剪切TextView文本

java - 如何从ArrayAdapter列表中启动新的Fragment?