decltype需要实例化对象

Snp*_*nps 2 c++ coding-style c++11

我正在尝试使用C++ 11标准,并提出了这个问题:

在C++ 11可以使用autodecltype自动获取返回类型的函数,例如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(); };
};
Run Code Online (Sandbox Code Playgroud)

我的问题是我必须在公共声明vector<T> v 之前声明私有,这违反了我的编码风格.我想公众成员之后宣布我的所有私人会员.您必须在函数声明之前声明向量,因为表达式in decltype是对向量成员函数的调用,begin()并且需要对象的实例.

有没有解决的办法?

Dav*_*own 6

您可以完全避免使用decltype,只需将返回类型设置为std::vector<T>::iterator.

如果你想使用auto,你可以使用std::declval从这样的类型获取值:

auto begin() -> decltype(std::declval<std::vector<T>>().begin()) { return v.begin(); };
Run Code Online (Sandbox Code Playgroud)

  • decltype方法的强大之处在于它具有正确的`this`类型.包括const成员函数. (2认同)