与C ++中模板类的getter setter接口

时间:2016-12-05 23:35:40

标签: c++ templates

上下文

我想创建一个Attribute变量向量,T标记任何其他类。样本:

template<typename T>
class Attribute{
public:
    string name;
    T value;
    Attribute(){  }
    Attribute(string n, T val){ name = n; value = val; }
    string getName(){ return name; }
    string setName(string n){ name = n; }
    T getAttr(){ return value; }
    void setAttr(T v){ value = v; }
};

现在,我想创建一个向量,它可以包含不同类型的属性,如Attribute \和Attribute \。由于在创建向量时必须给出用于Attribute的模板,我想要使用抽象基类或接口。

真正的问题

我有一个名为AttributeInterface的接口,它定义了Attribute的可能方法,但是我无法为Attribute.value变量定义getter和setter方法,因为在使用模板之前我不知道它们的签名。如果我使用带有AttributeInterface的模板,那么我回到上一个块中提到的问题。

class AttributeInterface{
public:
    virtual string getName();
    virtual string setName();
    virtual ?? getAttr();
    virtual void setAttr(?? v);
};
template<typename T>
class Attribute: public AttributeInterface{
public:
    string name;
    T value;
    Attribute(){  }
    Attribute(string name, T val){ this.name = name; value = val; }
    string getName(){ return name; }
    string setName(string n){ name = n; }
    T getAttr(){ return value; }
    void setAttr(T v){ value = v; }
};

这将是预期的用法:

std::vector <??> vec;
// Or something along the lines of std::vector<AttributeInterface*> vec;
vec.push_back(new Attribute<float>("a", 1.0));
vec.push_back(new Attribute<int>("a", 10));

作为参考,在像Python这样的动态类型语言中,用例就是

class Attribute:
    ...
    def get(self):
        return self.value

    def set(self,v):
        self.value = v

l = []
l.append(Attribute('a',1.5))
l.append(Attribute('a',"foo"))
for i in l:
    print(i.get())

我原来的想法在c ++中是否可行?或者是否有更简单/更好的方法来实现Python示例中描述的行为?

提前致谢。

0 个答案:

没有答案