19

Scott Meyersによると、getterのconstバージョンとgetterのnon-constバージョンでコードが繰り返されるのを防ぐために、non-constバージョンからメソッドのconstバージョンを呼び出しstatic_cast<const A&>(*this).Methodology(); ます。私が入力したVisualAssistX Intellisense:const_cast<const A&>(*this).Methodology();そしてそれはうまく機能しました。

この場合、特定のキャストを使用した場合の違いは何ですか?

使用中のIDE:VisualStudio2010。

4

2 に答える 2

8

のタイプをとすると、this違いA*はありません。

一般に、指定子を(任意のレベルの間接参照またはテンプレートパラメーターから)const_castキャストすることができますconst

static_cast<>ターゲットタイプがソースのタイプ階層にある場合、タイプを別のタイプにキャストできます。

彼らはお互いの仕事をすることはできません。

両方があなたのケースで機能した理由は、const-nessを導入したためであり、それを取り除いたのではありません(関数の非constバージョンから、タイプthisA*、constではありません)。あなたも同じように書いた可能性があります

const A& tmp = *this;
tmp.Methodology();

そしてそれは鋳造を必要とせずに働いたでしょう。キャストは、新しい変数を導入する必要がないように、利便性と簡潔さのために使用されます。

:正しいタイプにキャストしていることがわかっstatic_cast<>ているので、ここで使用できます。その他の場合(確信が持てない場合)は、実行時の型チェックを実行して変換が有効であることを確認するために使用する必要がありますdynamic_cast<>

于 2012-06-20T20:30:09.047 に答える
6

から項目3を読み直した後Effective C++ 3rd Ed.、彼が実際に両方を使用することを提唱していたことに気付きました。constを追加してconstバージョンを呼び出し、戻り値のconst-ness(存在する場合)をキャストします。私の特定のケースでは、constの戻り値はなく、const-functionだけなので、wrapped-by-const_cast <>バージョンは必要なく、事実上、問題の2つの呼び出しに違いはありません。

(p。13)項目3: 可能な限りconstを使用する

..。

(p。23)constおよびnon - constメンバー関数の重複の回避

...本当にやりたいのは、operator []機能を1回実装し、それを2回使用することです。つまり、一方のバージョンの operator[]でもう一方のバージョンを呼び出す必要があります。そして、それは私たちに恒常性を捨てさせることになります。

...この場合、戻り値にconstをキャストするのは安全です。これは、non- const operator []を呼び出した人は、そもそもnon-constオブジェクトを持っていたに違いないからです。 operator []呼び出しconstバージョンは、キャストが必要な場合でも、コードの重複を回避するための安全な方法です。

class TextBlock {
public:

...

    const char& operator[](std::size_t position) const      //same as before
    {
        ...
        ...
        ...
        return text[position];
    }

    char& operator[](std::size_t position)        //now just calls const op[]
    {
        //cast away const on op[]'s return type;
        //add const to *this's type;
        //call const version of op[].
        return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);
    }
...
};

ご覧のとおり、コードには1つではなく2つのキャストがあります。非const演算子[]が必要です...無限再帰を回避するには、const演算子[]を呼び出すように指定する必要がありますが、これを直接行う方法はありません。代わりに、*これをネイティブタイプのTextBlock&からconst TextBlock&にキャストします。はい、キャストを使用してconstを追加します!したがって、2つのキャストがあります。1つはconstを* thisに追加し(operator []の呼び出しはconstバージョンを呼び出すため)、もう1つはconstを* constoperator[]の戻り値から削除します

于 2012-06-20T21:49:41.167 に答える