我希望这个标题最适合我的问题,但我会进一步解释。
我有两种我正在使用的数据类型(由Eigen库支持的Matrix和一对由保存int值的字符串键控的STL映射)。
我想允许我的代码尽可能一致地使用它们。所以我开始创建一个抽象基类,包括我需要的基本操作(插入,获取“行”等)并尝试派生两个子类来包装我的数据类型(一个用于矩阵,一个用于我的对)实现内部函数因为我需要。
这种方法运行了一段时间,但后来我遇到了一些打字问题,因为我的矩阵用整数索引,哈希映射用字符串索引(它们都以不同的方式表示相同的数据类型)。 当我试图编写检索“行”的代码时,我被卡住了,因为我知道我不能在我的基类中声明一个方法,然后用不同的参数类型覆盖它(矩阵通过数字索引和地图检索一行)通过字符串检索它。
如果没有过度使用每个子类的模板,是否有一种常见的方法呢?
代码示例可能会明确(原谅任何错误,因为这只是一个例子):
class BaseClass {
public:
virtual GenericRowType getRow(???? index)=0;
}
class MatrixWrapper : public BaseClass{
// Should be: GenericRowType getRow(int index);
}
class MapsWrapper : public BaseClass{
// Should be: GenericRowType getRow(string index);
}
答案 0 :(得分:2)
您可以使用模板:
template <typename T>
class BaseClass {
public:
virtual GenericRowType getRow(T index)=0;
}
class MatrixWrapper : public BaseClass<int>{
// Should be: GenericRowType getRow(int index);
}
class MapsWrapper : public BaseClass<string>{
// Should be: GenericRowType getRow(string index);
}
答案 1 :(得分:1)
这是使用模板的经典案例。您应该使用一个类模板参数创建BaseClass
模板,然后继承的类将继承到模板特化:
template <class T>
class BaseClass {
public:
virtual GenericRowType getRow(T index) = 0;
};
class MatrixWrapper : public BaseClass<int> {
public:
GenericRowType getRow(int index);
};
class MapsWrapper : public BaseClass<std::string> {
public:
GenericRowType getRow(std::string index);
};