Если я строю библиотеку для 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) {