Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ stl中的抽象映射与向量_C++_Stl_Map_Vector_Abstract Class - Fatal编程技术网

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。您需要详细说明地图的实际类型,以及键和comm值之间的关系
在此基础上,转换运算符。。。让我们有机会了解您在尝试什么,以及您为什么相信多态性是解决方案。@MatthieuM。我编辑了问题你还需要在函子上键入erase?这就是std::function已经存在的目的。两种std::函数类型的类型有何不同?签名应该是相同的。@pmr签名是相同的,但是类的成员是map1,如果我通过构造函数传递map2,它会给我一个错误,说明它们不是matching@djWann显而易见的解决方案是使map1成为map。BaseMap不应该有map实例。对于上述模式,基本接口类应该是抽象的。@Yakk为什么不呢?这完全取决于您在不同的map类上需要什么。如果他们都能使用同一个std::map,那么放它的正确位置很可能是基类。@Yakk啊,现在我看到他在我写了我的答案后对他的问题做了很多修改。BaseMap不应该有map实例。对于上述模式,基本接口类应该是抽象的。@Yakk为什么不呢?这完全取决于您在不同的map类上需要什么。如果他们都能使用相同的std::map,那么正确的放置位置很可能是基类。@Yakk啊,现在我看到在我写下答案后,他改变了很多问题。