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

为什么不像这样转换为 const SomeDataType*

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 才能做到这一点。所以你必须像你一样分两步施法。顺便说一下,在您的情况下,您不需要指针是非常量的。所以你可以简单地做:

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 回答