1

如果我有两个类 A 和 B 定义为:

class A {
    map<int, int> mMap;
    vector<int> mVec;

    void method() {
      // do something with mMap and mVec 
    }
}

class B {
    map<int, double> mMap; // just an example of a map with a different signature

    ...
}

有可能以某种方式使用 A 在 B 中的所有内容,但使用 B 中定义的新映射并且无需重写method

这是我正在尝试做的一个简化示例:使用新地图重构一个大类。

4

1 回答 1

1

如果你想使用

std::map<int, Y>

代替

std::map<int, X>

使用相同的代码,替换class A为,那么类型和class B之间可能存在很强的相关性。XY

在这种情况下,如果您不能在 上使用模板class A,一种可能的解决方法是分别为YXtoX和定义隐式类型转换运算符Y

class X {
    operator Y() {
        Y y;
        // Conversion logic
        return y;
    }
};

通过这样做,您无需更改代码,method因为映射上的插入或访问操作将自动调用隐式类型转换运算符。

警告说明:隐式转换运算符的滥用削弱了编译器的类型安全检查,您可能期望在代码的其他部分进行类型安全检查(例如:Y传递给的错误参数f(X &x))。

于 2012-12-19T21:58:53.357 回答