C++ 访问父类的子模板类的数据

C++ 访问父类的子模板类的数据,c++,C++,您可以动态地将指针强制转换为模板类。但是继承的意义在于将公共性放入基类,否则它们存在的意义是什么。如果可能的话,尝试将这个成员(它的一个抽象,独立于T)及其对基类的访问放在一起。毫无疑问,这取决于您希望通过此访问实现什么。对于这种类型的许多问题类,对于公共访问来说,实际的类型T根本不是必需的。如果这是不可能的,看看强制成员模板方案!此模式的基本原则可能对此类特殊问题有用 请记住,模板和多态性是C++中非常正交的方面。……继承是…………我想你要找的词是多态性。遗传的要点是多态性。OP的代码示例违反

您可以动态地将指针强制转换为模板类。但是继承的意义在于将公共性放入基类,否则它们存在的意义是什么。

如果可能的话,尝试将这个成员(它的一个抽象,独立于T)及其对基类的访问放在一起。毫无疑问,这取决于您希望通过此访问实现什么。对于这种类型的许多问题类,对于公共访问来说,实际的类型T根本不是必需的。如果这是不可能的,看看强制成员模板方案!此模式的基本原则可能对此类特殊问题有用


请记住,模板和多态性是C++中非常正交的方面。

……继承是…………我想你要找的词是多态性。遗传的要点是多态性。OP的代码示例违反了Liskov的替换原则,因为它想要降级。演示了一种糟糕的设计味道。我实际上尝试了类似的方法,但我无法使用它,因为模板类需要它的t.((*MyTemplateClass)x)->myx;它告诉我模板参数丢失,这很正常,但现在我无法传递模板参数。这是有意义的?整个想法是有一个模板类,它有一个无序的映射(对于我需要模板的映射),然后将这个类存储在一个向量中。然后循环并获取所有类及其所有无序映射,为此我正在命名。我需要这个基类将其用作指针,这样我就可以通过template类并实际使用template类中的数据(如果这有意义的话)。T是“动态的”,从这个意义上说,我有一堆结构,我想用它们来映射,它不是预定义的,所以这迫使我找到一种方法绕过模板类来获取它的数据。是的,我理解这一点,但是在这之后你想实现什么?这是一个重要的问题。然而,您的地图具有某种界面特征。在许多情况下,这不是一种好的设计方法。我认为,解决实际问题的关键方法在于对该地图进行智能抽象。我的计划是构建一个简单的实体组件系统,该向量将存储所有地图及其特定组件,一个地图表示位置,另一个表示速度。这就是为什么我需要模板。每个地图都有自己的“类型”,一个用于位置结构,另一个用于velocitie等。也许我必须像你说的那样考虑另一种解决方案。问题是我是初学者,我在不断地学习。相信我,对于几乎所有这些场景,对这个成员的简单抽象就是最好的选择。创建接口IMyMapType,或者如果您确实希望此映射作为固定容器,则仅为其值创建IMyMapValueType,并根据您真正想要实现的内容定义接口。第二个非常强大的方法是这里的variant/visitor方案,对于几个问题类别来说非常强大和快速,但是有一些缺点,特别是对于您不知道最终使用线是什么的情况。
#include <iostream>
#include <vector>
#include <memory>
#include <unordered_map>

using namespace std;

struct A { void what_type() { cout<<"A"<<endl; }};
struct B { void what_type() { cout<<"B"<<endl; }};

class MyCommonAncestor {

}; 

template <class T> 
class MyTemplateClass : public MyCommonAncestor {

   public:  
       std::unordered_map<int, T> myx; 
};

int main() {
    vector<shared_ptr<MyCommonAncestor>> myVector; 
    myVector.push_back(make_shared<MyTemplateClass<A>>()); 
    myVector.push_back(make_shared<MyTemplateClass<B>>()); 

   for (auto& x: myVector)
       x->myx; // just for the shake of this example
 return 0;
}
error: ‘class MyCommonAncestor’ has no member named ‘myx’