默认情况下,任何函数是否能够就地工作
Should any function be able to work in-place by default
如果我正在为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
应:
执行就地操作。
assert(&input != &output)
或引发异常。
也就是说,如果无法处理就地操作,则立即失败。在这些情况下,请非常明确地记录这一事实,最好是在对函数声明的注释中。
您始终可以自己执行该检查,例如:
void do_somthing(object const& input, object& output) {
if (&input == &output) { // error
当然,您可以避免开销,如果您可以更改函数的签名并返回更改的值,只需遵循 Tillaert 的建议:
object do_somthing(object const& input) {
相关文章:
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 在 Eclipse 中添加库的工作方式是否与在 Visual Studio 中相同?
- 隐式转换是否应该在模板参数的上下文中工作?
- C++:检查动态取消分配是否正常工作
- 将正常函数的工作分配给多个线程是否安全
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- SetTimer (带有回调函数)是否通过启动新线程来工作?
- 返回对局部变量的引用是否正常工作?
- 右值引用是否像右值引用一样工作
- C++编译器 g++.exe 无法编译简单的测试程序 - 确定 CXX 编译器是否工作失败
- 我是否应该在构造函数或成员方法中进行大量初始化工作
- std::move 是否始终按预期工作
- 在为工作线程访问 lambda 中捕获的向量列表中的元素引用时,是否需要互斥锁?
- opengl32.lib如何在Windows(仅1.1版本)上工作?它是否真正实现了OpenGL函数
- 我对变量在递归函数中如何工作的理解是否正确?
- 下课时的数组是否可以正常工作?
- 是否有任何简单的方法来查找当前的工作目录?C
- 朋友功能是否继承?为什么基类朋友功能在派生的类对象上工作
- 将 FPU 异常或 INF 投入工作是否可能/有效