接口是否只能指定方法名称,而不能返回返回类型?

时间:2011-12-11 01:54:18

标签: c++ templates interface polymorphism

假设我有一个类,例如下面定义的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();

如果不可能,您能提供替代解决方案吗?

2 个答案:

答案 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()。此调用可以绝对返回任何类型:charconst void*Value< Value< Value<const void*> > >等。您会对结果做什么?你怎么会为它定义变量?