3

我想用如下原型编写一个函数

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

我想考虑一个事实,ret可能会或可能不会被oneor别名two。如果需要,这应该在运行时确定,并调用适当的代码。

这是一个坏主意吗?有语言语义吗?

编辑:我还没有明确表示我不想像这样if (one == ret || two == ret)自然有效但对我来说似乎很冗长的手动测试。此外,我不希望两个几乎相同的情况重复代码(只有限定符不同)。我更多的是寻找惯用的好的解决方案,以及是否有任何语言语义支持这种情况。

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”语句的情况下在两个不同的参数中接收到相同的值。
那么不,不可能在 C 或 C++ 中实现这一点。
因为毕竟指针与否,它只是一个带值的参数……

于 2012-11-12T12:47:19.723 回答