3

次のようなプロトタイプで関数を書きたいのですが

void fun(Thing *one, Thing *two, Thing *ret);

またはretによってエイリアスされる場合とされない場合があるという事実を検討したいと思います。これは、必要に応じて実行時に決定し、適切なコードを呼び出す必要があります。onetwo

これは悪い考えですか?これを持つための言語セマンティクスはありますか?

編集:私は、自然に機能するように手でテストしたくないことを明確にしませんでしたが、私にif (one == ret || two == ret)は非常に冗長に見えます。また、ほぼ同じ2つのケースでコードが重複することは望ましくありません(修飾子のみが異なります)。私は、慣用的に良い解決策が何であるか、そしてそのような場合をサポートする言語セマンティクスがあるかどうかをもっと探しています。

4

2 に答える 2

4

問題のクラスのセマンティクスに大きく依存しますが、エイリアシングのテストが必要になることは非常にまれです。何かを変更し始める前にone、必要なすべての情報を入手してください。twoまた、変更を開始する前に、例外が発生する可能性のあるものをすべて終了したことを確認することもできます。

于 2012-11-12T12:49:30.467 に答える
1

これは可能であり、たとえば「スワップ」機能で多くの時間が使用されます。ポインターの値で確認できます。

void fun(Thing *one, Thing *two, Thing *ret)
{
    if (ret == one || ret == two)
    {
        //Alias - Spacial case
        return;
    }
    //Not Alias, continue usually...
}

編集:編集を読んだ後、「if」ステートメントを使用せずに、関数が2つの異なるパラメーターで同じ値を受け取ったかどうかを知る方法があるかどうかを尋ねているようです。
いいえ、C や C++ でこれを実現することはできません。
結局のところ、ポインターであろうとなかろうと、それは値を持つ単なるパラメーターだからです...

于 2012-11-12T12:47:19.723 に答える