我想用以下
之类的原型编写一个函数void fun(Thing *one, Thing *two, Thing *ret);
我想考虑ret
可能会或可能不会one
或two
存在别名的事实。这应该在运行时根据需要确定,并且适当的代码称为。
这是个坏主意吗?有没有语言语义?
编辑:我还没有明确表示我不想像if (one == ret || two == ret)
一样手工测试,它自然有效,但对我来说似乎非常冗长。此外,我不希望重复的代码用于两个几乎完全相同的情况(只有限定符不同)。我更关注什么是惯用的好解决方案,如果有任何语言语义支持这种情况。
答案 0 :(得分:4)
很大程度上取决于所讨论的类的语义,但是极少需要测试别名。在开始修改任何内容之前,只需从one
和two
获取所需的所有信息。您可能还希望确保在完成修改之前已经完成了可能引发异常的任何事情。
答案 1 :(得分:1)
这是可能的,并且在“交换”功能中使用了大量时间。你可以用指针的值检查它:
void fun(Thing *one, Thing *two, Thing *ret)
{
if (ret == one || ret == two)
{
//Alias - Spacial case
return;
}
//Not Alias, continue usually...
}
编辑:在阅读完编辑后,您似乎在询问是否有办法知道某个函数是否在两个不同的参数中接收到相同的值而不使用“if”语句。
那么不,用C和C ++来实现这一点是不可能的
因为毕竟指针与否,它只是一个带有值的参数......