0

更新の可能性についてを参照していた20〜30行のC++関数がありintます。ここで、渡されたメンバーを、次のように、より多くのデータをカプセル化するメンバーのメンバーに置き換えます。

searchState.matchedOK = specificSearch(*pageIndices.GetStringIByRef(), searchState); //new, and overwritten.
searchState.matchedOK = specificSearch(pageOffsetInText, searchState); //old

同等性以降を確認したら、古いメンバーを削除する必要があるため、この変更を上記の行と関数にローカライズしたいと思います。

これは単純なキャストで可能ですか?

コードが必要な場合:

static bool specificSearch(int &matchLocation, const SearchSpecs &specs) {/**/}

および最近追加されたメンバー:

inline unsigned int *GetStringIByRef() {return &stringI;}
4

4 に答える 4

2

私はあなたの質問を100%理解しているとは限らないので、ここのマークを完全に見逃すかもしれません。ただし、関数をテンプレートにすると、次のようになります。

template<typename IntType>
static bool specificSearch(IntType &matchLocation, const SearchSpecs &specs) {/**/}

これにより、どちらのタイプも渡すことができます。

于 2012-03-20T22:03:07.393 に答える
1

基本的な問題は、関数がオブジェクトspecificSearchに割り当てることです。intしかし、あなたが書きたいのはunsigned intオブジェクトです。幸い、厳密なエイリアシングルールにより、のようにに書き込むことunsigned intができintます。型システムはそれを正確に奨励するわけではありませんが、説得することができます:

searchState.matchedOK = specificSearch(*reinterpret_cast<int*>(pageIndices.GetStringIByRef()), searchState);

この種の種類は、2つのタイプ(0から)の共通の範囲にあるように書き込まれる値に依存しますINT_MAX。2の補数システムでは、その範囲外の値を書き込んだ結果は、値をに変換した結果と同じであるため、「一種の」と言いますunsigned int。2の補数以外のシステムでは、実際には存在しませんが、原則として移植可能なコードの試みを悩ませますが、結果は異なり、したがっておそらく間違っています。

可能であれば、次のオーバーロードを定義する方がよい場合がありますspecificSearch

static bool specificSearch(unsigned int &matchLocation, const SearchSpecs &specs) {
    int loc;
    bool retval = specificSearch(loc, specs);
    if (retval) { // I'm guessing here about the meaning of the return value
        matchLocation = loc; // converts int to unsigned int
    }
    return retval;
}

これは、ラッパー関数が「実際の」specificSearchがに割り当てられているかどうかを判断できることを前提としlocているため、に割り当てるかどうかがわかりmatchLocationます。呼び出し元の関数がどういうわけかそれを理解できない場合、これは実際には機能しません(そしてspecificSearch、例外を割り当ててスローすることが許可されている場合は、それも考慮する必要があります)。

可能であればstringI、適切なタイプに変更する方が賢明です。

于 2012-03-20T22:00:59.687 に答える
1

テンプレートを使用してこれを行うことができます。

template<typename T>
static bool specificSearch(T& matchLocation, const SearchSpecs& specs) {/**/}

そして、関数内に割り当てmatchLocationます。このようにして、関数で割り当てているタイプに割り当てられる任意のタイプを使用できますmatchLocation

何らかの理由でそれが気に入らず、とのみで機能させたい場合intunsigned int、テンプレートの特殊化を使用できます。

// leaving this undefined, which will cause a linker error if you use it with other types
template<typename T>
static bool specificSearch(T& matchLocation, const SearchSpecs& specs);

template<>
static bool specificSearch<int>(int& matchLocation, const SearchSpecs& specs) {
    /* definition */
}

template<>
static bool specificSearch<unsigned int>(unsigned int& matchLocation, const SearchSpecs& specs) {
    // use the other one to avoid code duplication
    int tmp = matchLocation;
    bool retval = specificSearch(tmp, specs);
    matchLocation = tmp;
    return retval;
}

2つのタイプの範囲が異なるため、これらの関数間の変換intおよびこれらの関数の使用について警告が表示される可能性があることに注意してください。unsigned int

于 2012-03-20T22:05:53.580 に答える
0

ここにいくつかの問題があります。まず第一に、あなたの意図によっては、単にstringI価値によって返す方が良いかもしれません。それ以外の場合は、次のように署名を調整できます。

inline unsigned int &GetStringIByRef() { return stringI; }

C++参照を利用するため。

はどうかと言うと

static bool specificSearch(int &matchLocation, const SearchSpecs &specs) {/**/}

あなたはそれを次のように呼ぶでしょう:

searchState.matchedOK = specificSearch(reinterpret_cast<unsigned int&>(pageIndices.GetStringIByRef()), searchState);

それでもオブジェクト自体に依存します(そうである場合const)、私は考えます。

不明な点がある場合、または要点を見逃した場合は、コメントしてください。回答を調整します。

于 2012-03-20T21:56:35.350 に答える