1

値またはオブジェクトが存在しない場合に特別なものを返す関数の最良のシグネチャは何ですか?

複数のオブジェクトを返す関数の場合、関数プロトタイプは

QList<X> getSomeXOrNothing(); 
  • オブジェクトがある場合はオブジェクトのリストを返し、オブジェクトがない場合は空のリストを返します。これは私のニーズに完全に適合し、操作に便利です。

さて、関数は単一のオブジェクトしか返さないか、何も返さないことを知っています。最良のシグネチャは何でしょうか? エラーリークの可能性があるため、生のポインターを返すことは望ましくありません。

共有ポインターを返すか、単一の値を持つリストを返すかについて議論しています。

QList<X> getSingleXOrNothing(); 
QSharedPointer<X> getSingleXOrNothing(); 

しかし、それを行うためのより良い方法があるかどうか疑問に思っています-共有ポインターは不要なオーバーヘッドを追加しますが、リストにはオブジェクトを1つしか含めることができないことがわかっているため、リストを返すことは議論の余地があります.

編集: QList、SharedPointr、および QVariant のすべてが許容されるオプションですが、私はすべてのバイトがカウントされる組み込みデバイス用に開発しており、この関数への呼び出しが多数あるため、条件を指定して最適なコンテナーを見つけようとしています-それは 1 つですオブジェクトまたは何もありません。

4

4 に答える 4

3

「オプションパターン」を利用できます。基本的な考え方は次のとおりです。

template <typename T>
class Optional {
    private:
        bool valueIsPresent;
        T value;
}

次に、関数から返すことができますOptional<YourType>。クライアントコードは、値にアクセスして使用する前に、値が実際に存在するかどうかを確認できます。

于 2013-08-28T18:04:01.547 に答える
1

私はC++でそれを使用したことはありませんが、試してみるのは楽しいアイデアかもしれません-特にコンパイラがテールコールの最適化とC++ 11をサポートしている場合(おそらく埋め込まれていない場合)、継続スタイル(「教会エンコーディング」)を使用しないでくださいでも、チェックするのは楽しいかもしれません)?

template<typename One, typename Zero, typename X>
X getSomeOrZero (One one, Zero zero) {
    if (logic)
        return one (X ());
    else
        return zero ();
}

void process () {
    auto x = getSome ([] (one) => { handle one }, [] () => { handle zero });
}

より保守的な (正しい?) アプローチについては、Mario answer を参照してください。

于 2013-08-28T19:13:04.307 に答える
0

Qt 自体はisValid()orisNull()メソッドを使用することがよくあります。
クラスにメンバーを追加isValidし、デフォルトのコンストラクターでそのメンバーをfalseに初期化すると、適切な解決策が得られます。

于 2013-08-28T23:06:39.750 に答える
0

オブジェクトが存在しない場合は例外をスローします。

それを行う最も簡単で安全な方法。

Plus では、オブジェクトが存在するかどうかを確認するために bool 値の余分なオーバーヘッドは必要ありません。

于 2013-08-28T18:29:15.133 に答える