3

関数

int compare(const void* a, const void* b)
{
    SomeDataType g1 = *(static_cast<SomeDataType*>(a));
    SomeDataType g2 = *(static_cast<SomeDataType*>(b));
    g1.firstelement < g2.firstelement ? 1 : -1;
}

このコードは、「静的キャストは const void* から SomeDataType* にキャストできません」というエラーを返します。私は const_cast のように使用します

SomeDataType g1 = *(static_cast<SomeDataType*>(const_cast<void*>(a))) ; 

これを機能させるには。それは正しい方法ですか?または、何か不足していますか?これがどのように機能するのかよくわかりません。

4

6 に答える 6

5

それは正しく感じるべきではないので、それは正しく感じられません。誰かがあなたにポインタを与え、あなたがそれを変更しないと約束したインターフェースで、それを捨てることconstはあなたの約束を破っています(まあ、実際にはそうではありませんが、型システムはあなたがconstを捨てた場合、それはあなたが変更したいからだと考えていますあなたの約束を破るであろうオブジェクト)。

const私はあなたが:を落とさないことをお勧めします

int compare(const void* a, const void* b)
{
    SomeDataType g1 = *(static_cast<const SomeDataType*>(a));
    SomeDataType g2 = *(static_cast<const SomeDataType*>(b));
    return g1.firstelement < g2.firstelement ? 1 : -1;
}
于 2013-03-11T15:47:22.957 に答える
2

これを行う:

const SomeDataType g1 = *static_cast<const SomeDataType *> (a);
const SomeDataType g2 = *static_cast<const SomeDataType *> (b);

ここは必要ありませんconst_cast

しかし、私はこれを好みます:

int compare(const SomeDataType &g1, const SomeDataType &g2)
{
    return g1.firstelement < g2.firstelement ? 1 : -1;
}
于 2013-03-11T15:45:25.567 に答える
1

このようにconstSomeDataType*に変換してみませんか

SomeDataType g1 = *(static_cat<const SomeDataType*>(a));

もちろん、それを行うとデータのコピーが作成されますが、代わりにこれを行う必要があります

const SomeDataType& g1 = *(static_cat<const SomeDataType*>(a));
const SomeDataType& g2 = *(static_cat<const SomeDataType*>(b));
g1.firstelement < g2.firstelement ? 1 : -1;
于 2013-03-11T15:46:43.987 に答える
1

static_castは、ポインタからconst-nessを削除することはできず、削除することを意図したものではありません。それができるキャストはconst_castだけです。したがって、あなたはあなたがするのと同じように2つのステップでキャストしなければなりません。ちなみに、あなたの場合、ポインタが非定数である必要はありません。だからあなたは単にするかもしれません:

int compare(const void* a, const void* b)
{
    const SomeDataType* g1 = static_cast<SomeDataType*>(a);
    const SomeDataType* g2 = static_cast<SomeDataType*>(b);
    g2->GetFirstElement() - g1->GetFirstElement();
}

使用するフィールドにconstアクセサーを実装したと仮定します。

于 2013-03-11T15:46:44.860 に答える
1

どうですか :

int compare(const void* a, const void* b)
{
    const SomeDataType *g1 = static_cast<const SomeDataType*>(a);
    const SomeDataType *g2 = static_cast<const SomeDataType*>(b);
    return g1->firstelement < g2->firstelement ? 1 : -1;
}
于 2013-03-11T15:47:59.557 に答える
0

コンストを使おう!

const SomeDataType g1 = *(static_cast<SomeDataType const *>(a));

を変更するつもりg1はないので、それを const にする必要はありません。

おそらく次も必要ですreturn

return  g1.firstelement < g2.firstelement ? 1 : -1;

g1 == g2 も気にするかどうかわかりませんか?

于 2013-03-11T15:46:13.960 に答える