C++ C++;包含多种类型模板类的std::vector中存储的实例的访问方法

C++ C++;包含多种类型模板类的std::vector中存储的实例的访问方法,c++,templates,vector,C++,Templates,Vector,我希望访问存储在向量中的GraphProperty类的方法setProperty。因为我的类GraphProperty是一个模板,所以我必须将向量定义为GraphProperty的父类。但是,不允许在GraphPropertiesAnyType中定义虚拟方法模板。是否有任何解决方案可以从存储在my vector中的元素访问方法setProperty class GraphPropertiesAnyType { public: GraphPropertiesAnyType() = defa

我希望访问存储在向量中的GraphProperty类的方法setProperty。因为我的类GraphProperty是一个模板,所以我必须将向量定义为GraphProperty的父类。但是,不允许在GraphPropertiesAnyType中定义虚拟方法模板。是否有任何解决方案可以从存储在my vector中的元素访问方法setProperty

class GraphPropertiesAnyType {
public:
    GraphPropertiesAnyType() = default ;

    template<typename P>
    virtual void setProperty(int v, P property) = 0; // not allowed 
};

template <typename P>
class GraphProperties : public GraphPropertiesAnyType
{
public:

    GraphProperties() = default ;

    GraphProperties(std::string name): name(name) {};

    void setProperty(int v, P property)
    {
        auto p = std::make_pair(v.first, property);
        this->property.insert(p);
    }

private:
    std::string name;
    std::map <int, P> property;
};
类GraphPropertiesAnyType{
公众:
GraphPropertiesAnyType()=默认值;
模板
虚拟void setProperty(int v,P property)=0;//不允许
};
模板
类别GraphProperty:公共GraphPropertiesAnyType
{
公众:
GraphProperties()=默认值;
GraphProperty(std::string name):name(name){};
void setProperty(int v,P属性)
{
自动p=std::make_pair(v.first,property);
此->属性.插入(p);
}
私人:
std::字符串名;
std::map属性;
};
主要
int main(int argc,char**argv){
std::向量v;
std::唯一的ptr元素;
v、 向后推(元素);//工作正常
v[0].setProperty(5,10);//我的问题就在那里
}

您没有提供足够的信息。你的“问题”是什么?我的意思是,你需要描述编译器错误(或其他什么),而不是假设人们知道你所说的“问题”。
template-virtual-void-setProperty(V,P-property)=0是非法的。你不能有一个虚拟函数模板。不,你不能有一个
setProperty
函数而不知道要设置什么属性。所以我除了定义一个我想要使用的所有类型的虚拟方法之外别无选择,对吗?你可以研究一下“类型擦除”。我自己还没有试过,但名字听起来可能有用。你没有提供足够的信息。你的“问题”是什么?我的意思是,你需要描述编译器错误(或其他什么),而不是假设人们知道你所说的“问题”。
template-virtual-void-setProperty(V,P-property)=0是非法的。你不能有一个虚拟函数模板。不,你不能有一个
setProperty
函数而不知道要设置什么属性。所以我除了定义一个我想要使用的所有类型的虚拟方法之外别无选择,对吗?你可以研究一下“类型擦除”。我自己也没试过,但名字听起来可能有用。
int main(int argc, char **argv) {
      std::vector<std::unique_ptr<GraphPropertiesAnyType> > v ;
      std::unique_ptr<GraphProperties<int, int, int> > elem;
      v.push_back(elem); // work fine
      v[0].setProperty(5, 10); // my issue is there
}