Может ли интерфейс указывать только имена методов, но не возвращаемый тип? - PullRequest
0 голосов
/ 11 декабря 2011

Предположим, у меня есть класс, такой как 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 ]

1 голос
/ 11 декабря 2011

В 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.

0 голосов
/ 11 декабря 2011

Нельзя перегрузить тип возвращаемого значения, так как это приведет к возникновению всевозможных двусмысленностей.

Я не совсем уверен, что вы пытаетесь сделать здесь. Я предполагаю, что вы переберите blah или выберете из него случайный элемент, а затем вызовете getValue() для указанного элемента. Этот вызов может вернуть абсолютно любой тип: char, const void*, Value< Value< Value<const void*> > > и т. Д. Что бы вы сделали с результатом? Как бы вы даже определили для него переменную?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...