功能
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;
}
此代码返回一个错误,说明&#34;静态转换不能从const void *转换为SomeDataType *。&#34;我使用const_cast之类的
SomeDataType g1 = *(static_cast<SomeDataType*>(const_cast<void*>(a))) ;
让这个工作。这是一种正确的方法吗?或者我错过了什么?我不太明白这是如何运作的。
答案 0 :(得分: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;
}
答案 1 :(得分: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;
}
答案 2 :(得分: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;
答案 3 :(得分:1)
static_cast无法从指针中删除const-ness,并不意味着这样做。只有施法才能做到这一点是const_cast。所以你必须像你一样分两步。在你的情况下,你不需要指针是非const的。所以你可以这样做:
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访问器。
答案 4 :(得分: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;
}
答案 5 :(得分:0)
使用const!
const SomeDataType g1 = *(static_cast<SomeDataType const *>(a));
由于你不会改变g1
,所以没有必要让它变成const。
您可能还需要return
:
return g1.firstelement < g2.firstelement ? 1 : -1;
不确定你是否也关心g1 == g2?