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;

これは形式が正しくありません(名前付きの変数を宣言していますsomething...それに追加しますか?

2番目の例、使用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 に答える