Должна ли какая-либо функция работать на месте по умолчанию

Если я строю библиотеку для 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 может не так как было написано в документации.

1

Решение

Вообще говоря, правильный способ идентифицировать такие функции — заставить их возвращать выходное значение:

object do_somthing(object const& input);

если ты не могу пусть они возвращают выходное значение, и вместо этого вы должны использовать выходной параметр, затем do_something должен либо:

  1. Выполните операцию на месте.

  2. assert(&input != &output) или выбросить исключение.

То есть, если вы не можете обрабатывать операции на месте, немедленно выполняйте их. И в этих случаях задокументируйте этот факт очень явно, желательно в комментарии к объявлению функции.

6

Другие решения

Вы всегда можете выполнить эту проверку самостоятельно, например:

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

Конечно, вы можете избежать накладных расходов и просто последовать совету Tillaert, если вы можете изменить сигнатуру функции и вернуть измененное значение:

 object do_somthing(object const& input) {
3

По вопросам рекламы [email protected]