假设我有一个类,例如下面定义的Value
。
template <typename T>
class Value : public ValueInterface
{
public:
// ...
T getValue() const;
private:
T value_;
}
我可以在我的代码中一般性地引用不同类型的多个Value
(即,使用不同的T
类型)(例如,创建容器)?我的第一个想法是,是否有可能以某种方式声明Value
可以继承的纯抽象类:
class ValueInterface
{
public:
?? getValue() const = 0;
}
template <typename T>
class Value : public ValueInterface
{
// ...
}
std::list<ValueInterface> lst;
Value<int> i(...);
Value<char> c(...);
lst.push_back(i);
lst.push_back(c);
int vi = i.getValue();
char vc = c.getValue();
如果不可能,您能提供替代解决方案吗?
答案 0 :(得分:1)
在C ++中,所有表达式都必须具有编译器已知的类型,但在您的解决方案lst.begin()->getValue()
中没有任何特定类型。
虽然如果你仔细看你的例子,你不是在任何地方调用ValueInterface::getValue()
,只是子类版本。
您可以尝试以下操作:
class ValueInterface
{
public:
template <typename T>
T getValue() const
{
return dynamic_cast< const Value<T> &>(*this).getValue();
}
virtual ~ValueInterface()
{ }
};
template <typename T>
class Value : public ValueInterface
{
public:
// ...
T getValue() const;
private:
T value_;
};
请注意,getValue()
不是(也不可能)是虚拟的。
现在您可以编写示例中的代码,但也可以:
int z = lst.begin()->getValue<int>();
如果您在getValue
调用中使用了错误的类型,则会抛出异常std::bad_cast
。
答案 1 :(得分:0)
你不能在返回类型上重载,因为这会产生各种歧义。
我不太确定你在这里要做什么。我假设您将迭代blah
或从中选择一个随机元素,然后在所述元素上调用getValue()
。此调用可以绝对返回任何类型:char
,const void*
,Value< Value< Value<const void*> > >
等。您会对结果做什么?你怎么会为它定义变量?