C++ stl中的抽象映射与向量
如果我有三种类型的贴图和向量:C++ stl中的抽象映射与向量,c++,stl,map,vector,abstract-class,C++,Stl,Map,Vector,Abstract Class,如果我有三种类型的贴图和向量: map1<CString, int> map2<CString, int, std::function1> map3<some_wrapper_of_CString, int, std::function2> 在stl中,是否有一个抽象容器或一种编写自己的抽象容器的方法,仅用于执行多态性: 抽象地图=地图1或地图2或地图3 我的类包含map1,我无法修改它,因为它将使我所在的学院在工作中使用的其他类崩溃。我想通过创建一个抽象映
map1<CString, int>
map2<CString, int, std::function1>
map3<some_wrapper_of_CString, int, std::function2>
在stl中,是否有一个抽象容器或一种编写自己的抽象容器的方法,仅用于执行多态性:
抽象地图=地图1或地图2或地图3
我的类包含map1,我无法修改它,因为它将使我所在的学院在工作中使用的其他类崩溃。我想通过创建一个抽象映射来包装map1,我可以通过map2和Map3,而无需其他修改
我希望这是有道理的
在stl中,是否有一个抽象容器或一种方法来编写我自己的抽象容器,以实现多态性
标准C++库中没有.</P> 模板和动态多态性不能很好地混合
在stl中,是否有一个抽象容器或一种方法来编写我自己的抽象容器,以实现多态性标准C++库中没有.</P>
模板和动态多态性不能很好地结合起来。不,没有。当元素不能相互转换时,它的目的是什么 您可以随时执行以下操作:
containera c;
containerb c2(c.begin(), c.end());
将所有元素从一个容器转换为另一个容器
如果您实际拥有具有相同底层值类型的容器,那么容器类型上的通常抽象是迭代器,而不是抽象容器
在澄清只希望对函子类型进行类型擦除后:
class X {
// constructor taking the full type
X(const std::map<CString, int, std::function<bool(CString, int)>& x) : my_map(x) {}
// constructor taking the default std::less
X(const std::map<CString, int>& x) : my_map(x.begin(), x.end(), std::less<CString>()) {}
private:
std::map<CString, int, std::function<bool(CString, int)> my_map;
};
不,没有。当元素不能相互转换时,它的目的是什么 您可以随时执行以下操作:
containera c;
containerb c2(c.begin(), c.end());
将所有元素从一个容器转换为另一个容器
如果您实际拥有具有相同底层值类型的容器,那么容器类型上的通常抽象是迭代器,而不是抽象容器
在澄清只希望对函子类型进行类型擦除后:
class X {
// constructor taking the full type
X(const std::map<CString, int, std::function<bool(CString, int)>& x) : my_map(x) {}
// constructor taking the default std::less
X(const std::map<CString, int>& x) : my_map(x.begin(), x.end(), std::less<CString>()) {}
private:
std::map<CString, int, std::function<bool(CString, int)> my_map;
};
不仅STL中没有抽象容器:您永远不应该从STL容器继承,因为它们不打算表现为多态性,例如,没有虚拟析构函数。所以你必须寻找一个不同的解决方案 在这种情况下,您必须支持组合而不是继承。您可以编写自己的抽象映射类,其中包含std::map,例如:
template<typename T>
class BaseMap
{
// Whatever you need here
private:
std::map<T> internalMap;
}
然后根据需要从该类继承:
template<typename T>
class Map1 : public BaseMap<T>
{
// Specialise your class here
}
当然,BaseMap应该提供映射所需的接口,因为它不继承std::map接口。您可以在这里编写所需的任何虚拟、纯虚拟或非虚拟方法
尽管你可能要问自己的第一个问题是:你真的需要不同的地图类吗?如果是这样,您真的需要它们是多态的吗?不仅STL中没有抽象容器:您永远不应该从STL容器继承,因为它们不打算表现为多态性,例如,没有虚拟析构函数。所以你必须寻找一个不同的解决方案 在这种情况下,您必须支持组合而不是继承。您可以编写自己的抽象映射类,其中包含std::map,例如:
template<typename T>
class BaseMap
{
// Whatever you need here
private:
std::map<T> internalMap;
}
然后根据需要从该类继承:
template<typename T>
class Map1 : public BaseMap<T>
{
// Specialise your class here
}
当然,BaseMap应该提供映射所需的接口,因为它不继承std::map接口。您可以在这里编写所需的任何虚拟、纯虚拟或非虚拟方法
尽管你可能要问自己的第一个问题是:你真的需要不同的地图类吗?如果是的话,你真的需要它们是多态的吗?@djWann:取决于你到底想做什么。@djWann:取决于你到底想做什么。目的是修改一个类,尽可能减少更改,以便在使用不同类型的类时获得灵活的行为maps@djWann那么地图上的T总是一样的吗?@djWann我加了一个保持与现有客户端兼容的变体。其目的是用尽可能少的更改来修改类,以便在使用不同类型的客户端时获得灵活的行为maps@djWann那么地图中的T总是一样的吗?@djWann我添加了一个变体,以保持与现有客户机的兼容性。您需要详细说明实际的T地图的类型,以及键和值之间的关系公共基、转换运算符等。。。让我们有机会了解您在尝试什么,以及您为什么相信多态性是解决方案。@MatthieuM。我编辑了问题你还需要在函子上键入erase?这就是std::function已经存在的目的。两种std::函数类型的类型有何不同?签名应该是相同的。@pmr签名是相同的,但是类的成员是map1,如果我通过构造函数传递map2,它会给我一个错误,说明它们不是matching@djWann显而易见的解决方案是将map1制作成一个map
在此基础上,转换运算符。。。让我们有机会了解您在尝试什么,以及您为什么相信多态性是解决方案。@MatthieuM。我编辑了问题你还需要在函子上键入erase?这就是std::function已经存在的目的。两种std::函数类型的类型有何不同?签名应该是相同的。@pmr签名是相同的,但是类的成员是map1,如果我通过构造函数传递map2,它会给我一个错误,说明它们不是matching@djWann显而易见的解决方案是使map1成为map