6

関数から空のペアを返すことは可能ですか? つまり、関数プロトタイプの規則に従いますが、ペアには要素がありません (NULL など)。ペアが単に存在することを理解しているので、これが概念的に可能かどうかはわかりません。意味がある場合は、NULL または空のペアを返す必要があります。

例えば、

pair<int, int> MyClass::someFunction()
{

   // do something that means we need to return an empty pair
   return NULL; // <--- this does not work obviously
}

残念ながら、ブーストは私には不可能です。

4

5 に答える 5

6

一般的に言って、空のペアは意味がありません。結局のところ、apairは定義ごとに2つのオブジェクトを含むコンテナです。

ただし、 Boost.Optionalを使用して、空のペアのようなものを作成できます。次にboost::optional<std::pair<...>>、ペアまたは空の状態を返すオプションを提供するか、std::pair<boost::optional<...>, boost::optional<...>>いずれかのオブジェクトが空になる可能性のあるペアに使用します。

于 2012-08-03T18:51:47.967 に答える
3

ポインタを返すことができます...またはを使用しますboost::optional<T>。オプションの方が良いでしょう...

boost::optional<std::pair<int, int> > MyClass::someFunction()
{
    return boost::optional<std::pair<int, int> >();
}

void f(const MyClass& f)
{
    boost::optional<std::pair<int, int> > ret = f.someFunction();
    if (!ret) // empty
    {
        ...
    }
}
于 2012-08-03T18:51:10.293 に答える
3

この場合、C ++コンパイラがコードを生成する方法を検討することで、質問に対する答えを簡単に説明できます。

std::pair<int, int>値で返されます。

MyClass::someFunction()はオブジェクトを値で返すため、イベントのシーケンスは次のようになります。

  • 呼び出し元の関数は、スタック上のスペースを予約します。std::pair<int, int>
  • MyClass::someFunction()呼ばれる
  • returnステートメントの右側は、前にスタックで予約された場所への割り当てです。std::pair<int, int>起こっていることの暗黙の構造があります。

したがって、NULLポインタを返すことは不可能です。

于 2012-08-03T19:24:40.850 に答える
2

独自の「オプションのペア」を作成するのにそれほど時間はかかりません (に似てboost::optional<std::pair<…&gt;>いますが、インターフェイスが異なります)。たとえば、次のようになります。

template <typename T1, typename T2> struct OptPair : std::pair<T1, T2>
{
  typedef std::pair<T1, T2> base_t;
  bool contains;
  OptPair() : contains(true) {}
  explicit OptPair(bool x) : contains(x) {}
  OptPair(const T1& x, const T2& y) : base_t(x, y), contains(true) {}
  template <class U, class V>
  OptPair(const std::pair<U,V> &p) : base_t(p), contains(true) {}
  template <class U, class V> OptPair(const OptPair<U,V> &p) : base_t(p), contains(p.contains) {}
  // No need to define operator=, as the default will construct an OptPair<T1, T2>
  // if necessary, then copy members into *this.
};

template <typename T1, typename T2>
OptPair<T1, T2> makeOptPair() { return OptPair<T1, T2>(); }

template <typename T1, typename T2>
OptPair<T1, T2> makeOptPair(const T1 &x, const T2 &y) {
  OptPair<T1, T2> p(true);
  p.first = x;
  p.second = y;
  return p;
}

template <typename OS, typename T1, typename T2>
OS &operator<<(OS &os, const OptPair<T1, T2>& p) {
  os << "<OptPair: ";
  if (p.contains) os << p.first << ", " << p.second;
  else os << "empty";
  os << ">";
  return os;
}

次に、std::pair と同じように使用できます (また、値を前後に代入して std::pair と交換可能に使用することもできます) が、次のように「空の」値を戻す​​機能が追加されています。

OptPair<int, int> someFunction()
{
   ...
   return OptPair<int, int>(false); 
}

次のように、使用する前に必ず結果を確認する必要があります。

void doStuffWithPair(std::pair<int, int>);
void doStuffWithEmpty();
...
OptPair<int, int> ret = someFunction();
if (ret.contains) doStuffWithPair(ret);
else doStuffWithEmpty();
于 2012-08-03T19:17:30.173 に答える
1

定義上、ペアには 2 つの要素があります。なしにすることはできません。

のようなものが必要ですboost::optional<std::pair<T1,T2>>。次に、ペアを持つかどうかを選択できます。boost::optional のドキュメントはこちらにあります

于 2012-08-03T18:49:01.257 に答える