decltype требует инстанцированного объекта - PullRequest
2 голосов
/ 18 марта 2012

Я немного поэкспериментировал со стандартом C ++ 11 и придумал эту проблему:

В C ++ 11 вы можете использовать auto и decltype для автоматического получения типа возвращаемого значения для функции, как, например, функции begin() и end() ниже:

#include <vector>

template <typename T>
class Container {
private:
    std::vector<T> v;
public:
    auto begin() -> decltype(v.begin()) { return v.begin(); };
    auto end() -> decltype(v.end()) { return v.end(); };
};

Моя проблема в том, что я должен объявить приватное vector<T> v перед публичным объявлением, что противоречит моему стилю кодирования. Я хотел бы объявить всех своих частных членов после моими открытыми членами. Вы должны объявить вектор перед объявлением функции, потому что выражение в decltype является вызовом функции-члена вектора begin() и требует экземпляра объекта.

Есть ли способ обойти это?

1 Ответ

6 голосов
/ 18 марта 2012

Вы можете вообще не использовать decltype и просто установить тип возвращаемого значения std::vector<T>::iterator.

Если вы хотите использовать авто, хотя вы можете использовать std::declval, чтобы получитьзначение только из типа:

auto begin() -> decltype(std::declval<std::vector<T>>().begin()) { return v.begin(); };
...