默认情况下,任何函数是否能够就地工作

Should any function be able to work in-place by default

本文关键字:工作 是否 情况下 任何 函数 默认      更新时间:2023-10-16

如果我正在为C++构建一个库。如果某些函数无法接受就地操作,是否可以?会影响库的标准属性吗?

例如:

void do_somthing(object const& input, object& output);
int main(){
   object a;
   object b;
   do_somthing(a, b);//OK
   do_somthing(a, a);//wrong
}

如果没问题,我应该怎么说呢? 例如,我应该放一个断言吗? 抛出异常?只是把它放在文档中,如果有人坚持调用它,让它产生未定义的行为?

一些澄清:

在 OpenCV 库中,一些像 cv::Canny 这样的函数可以像这样工作:

cv::Canny(img,img,100,200);

但是,cv::warpAffine不能像文档中写的那样。

一般来说,识别此类函数的正确方法是让它们返回输出值:

object do_somthing(object const& input);

如果不能让它们返回输出值,并且必须改用输出参数,则do_something应:

  1. 执行就地操作。

  2. assert(&input != &output)或引发异常。

也就是说,如果无法处理就地操作,则立即失败。在这些情况下,请非常明确地记录这一事实,最好是在对函数声明的注释中。

您始终可以自己执行该检查,例如:

   void do_somthing(object const& input, object& output) {
       if (&input == &output) { // error

当然,您可以避免开销,如果您可以更改函数的签名并返回更改的值,只需遵循 Tillaert 的建议:

 object do_somthing(object const& input) {