上下文
我想创建一个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示例中描述的行为?
提前致谢。