8

C++ でプログラミングしているとき、undefinedJavascript! のようなすべての変数に値があればいいのにと思うことがあります。たとえば、配列の範囲外の要素の値を返す場合undefined、例外をスローする代わりにを返すと便利でした。

template <typename T, int SIZE>
class MyArray
{
  T arr[SIZE];
  static T badref;
public:
  T &operator[](int i)
  {
    if (i >=0 && i < SIZE)
      return arr[i];
    else
      throw std::string("OUT-OF-BOUNDS"); // or: return badref; !!
  }
};

もう 1 つの汚い (私の意見では) オプションは、事前定義された変数の参照を不適切な参照変数として返すことです。null参照変数に代入できないことはわかっています。

呼び出し元が戻り値が無効であることを確認できる参照を返す別の適切なパターンはありますか?

編集:私は意地悪ではありませんpointer

4

4 に答える 4

5

@chris がコメントで述べたように、boost::optional を使用できます。Boost ライブラリの一部として提供されます。詳しくはこちらのページをご覧ください。

変更されMyArrayたクラス:

template <typename T, int SIZE>
class MyArray
{
  T arr[SIZE];
public:
  optional<T&> operator[](int i)
  {
    if (i >=0 && i < SIZE)
      return optional<T&>(arr[i]);
    else
      return optional<T&>();
  }
};

使用法:

MyArray<int>() array;
// fill array with data

optional<int&> result = array[0];
if (result) {
    // item was found
} else {
    // index out of bounds
}
于 2012-11-16T12:31:14.093 に答える
3

Javascriptのようなすべての変数に未定義の値があればいいのにと思います!

ポインタには「未定義」の値しかありません(nullptr)。参照とは、(定義上)有効なインスタンスを指すものです。

静的オブジェクトへの参照を返すには、演算子のconst値とnon-const値を分離する必要があります。

template <typename T, int SIZE>
class MyArray
{
  T arr[SIZE];
  static T badref;
public:
  T &operator[](int i)
  {
    if (i >=0 && i < SIZE)
      return arr[i];
    else
      // returning ref here would allow clients to write:
      // MyArray<int> a;
      // a[-1] = 5; // valid if you return a non-const reference
      throw std::string("OUT-OF-BOUNDS");
  }
  const T &operator[](int i) const
  {
    if (i >=0 && i < SIZE)
      return arr[i];
    else {
      // MyArray<int> a;
      // a[-1] = 5; // will not compile (cannot assign to const)
      static const T invalid = T();
      return invalid;
    }
  }

};

于 2012-11-16T13:02:34.883 に答える
2

何を考えても、ソリューションは型システムに適合する必要があります。したがって、関数のシグニチャは、結果がTである可能性があることを(このようにまたは別の方法で)明示的に指定する必要がありますが、それは別のものである可能性もあります。

そのための一般的な方法は次のとおりです。

  • 値を返す代わりに、ステータスコードを返し、「out」パラメータ(ポインタまたは参照)を介して値を出力します。

    bool tryGet(int i, T& result);
    
  • 次のようなタプル(ステータス、値)を返します。

    std::tuple<bool, T> get(int i)
    

    (取得できなかった場合は、2番目のタプル要素は無関係であると考えてください-Tにはデフォルトのコンストラクターが必要です)

  • 使用boost::variant(柔軟性がありますが、ブーストが必要です)

  • 使用boost::optional(「Tまたはなし」のいずれかのみが必要な場合は、上記のより単純なバージョン)
于 2012-11-16T12:50:40.960 に答える
0

参照の主な目的は、関数が引数を変更してデータをコピーしないようにしながら、無効な(NULL)値を回避することです。NULL値が必要な場合は、ポインターを使用してください。

于 2012-11-16T14:59:40.610 に答える