3

是否可以编写以下代码?我想做的是 do_vector_action 可以自动推断出函数的正确返回类型(我实际上拥有的代码在 cpp 文件中定义了函数,而不是在此处的标头中)。

class some_class
{
    public:
        std::vector<int> int_vector;
        auto do_vector_action() -> decltype(int_vector_.size())
        {
            decltype(int_vector.size()) something + 1;
            return something;
        }
}

此外,我还想知道,是否可以替换 typedef,例如

class some_class
{
    public:
        typedef std::vector<int> int_vector_type;
        int_vector_type int_vector;
        int_vector_type::size_type size;
}

使用 decltype 或其他一些构造,例如

  class some_class
  {
       public:
           std::vector<int> int_vector;
           decltype(int_vector)::size_type size;
  }

因为最后一个带有 decltype 的代码段不能用 Visual Studio 2012 RC 编译。

4

1 回答 1

5
decltype(int_vector.size()) something + 1;

这相当于:

std::vector<int>::size_type something + 1;

这是格式错误的(您正在声明一个名为somethingthen 的变量......向它添加一个?

你的第二个例子,使用decltype(int_vector)::size_type是有效的。由于编译器错误(*) ,Visual C++ 2010 和 2012 拒绝它。作为一种解决方法,您应该能够声明size为:

identity<decltype(int_vector)>::type::size_type size;

假设存在identity声明为的标准模板:

template <typename T>
struct identity { typedef T type; };

(*)decltype在 C++11 标准化过程即将结束时添加了在嵌套名称说明符中使用的功能(请参阅N3031 [PDF])。这是在 Visual C++ 2010 完成之后,并且在 Visual C++ 2012 中没有添加对此添加的支持。

于 2012-08-03T21:57:41.453 回答