默认情况下是否应该有任何功能能够就地工作
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
不能像文档中写的那样。
一般来说,识别此类函数的正确方法是让它们return输出值:
object do_somthing(object const& input);
如果您不能让它们return输出值,而您必须改用输出参数,那么do_something
应该:
执行in-place操作。
assert(&input != &output)
或抛出异常。
也就是说,如果您无法处理 in-place 操作,则立即失败。在这些情况下,非常明确地记录这个事实,最好是在函数声明的注释中。
您始终可以自己执行该检查,例如:
void do_somthing(object const& input, object& output) {
if (&input == &output) { // error
当然,如果您可以更改函数的签名和 return 更改后的值,您当然可以避免开销并简单地接受 tillaert 的建议:
object do_somthing(object const& input) {
如果我正在为 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
不能像文档中写的那样。
一般来说,识别此类函数的正确方法是让它们return输出值:
object do_somthing(object const& input);
如果您不能让它们return输出值,而您必须改用输出参数,那么do_something
应该:
执行in-place操作。
assert(&input != &output)
或抛出异常。
也就是说,如果您无法处理 in-place 操作,则立即失败。在这些情况下,非常明确地记录这个事实,最好是在函数声明的注释中。
您始终可以自己执行该检查,例如:
void do_somthing(object const& input, object& output) {
if (&input == &output) { // error
当然,如果您可以更改函数的签名和 return 更改后的值,您当然可以避免开销并简单地接受 tillaert 的建议:
object do_somthing(object const& input) {