Estoy tratando de escribir una función con múltiples valores de retorno. Necesito manejar el escenario cuando no hay imagen en el camino. ¿Cómo puedo hacer esto?

He intentado usar el mapa. Pero es más para Key, pares de valor es lo que creo (nuevo en C ++).

A continuación se muestra mi código:

tuple<Mat, Mat> imageProcessing(boost::filesystem::path pickPath){
    Mat img1, img2;
    // Check if file exists, if not return NULL
    if (!boost::filesystem::is_regular_file(pickPath)) {
        return make_tuple(NULL, NULL); 
    }

        imageFile = imread(pickPath.string());

        // Preprocess code (return 2 mat files)

        return make_tuple(img_1, img_2);
   }



int main(){
    path = "img.jpeg"
    tie(img1, img2) = imageProcessing(path);
}
1
Praveen 9 dic. 2019 a las 14:37

2 respuestas

La mejor respuesta

Use std :: vector si desea una colección contigua de objetos o use std :: set si su función garantiza devolver solo resultados únicos.

Su método también debe manejar los errores con gracia. En general, hay dos enfoques en C ++ para eso:

  1. Excepciones Cuando su función encuentra códigos de error / datos incorrectos de sus bibliotecas de terceros o cualquier otro escenario inesperado, puede lanzar una excepción y el llamador de la función necesita escribir código para manejarlo. Su método probablemente se verá así:
std::vector<Mat> ProcessImages(const boost:filesystem::path filePath)
{
   if (!boost::filesystem::is_regular_file(pickPath)) {
       throw std::invalid_argument("file does not exist"!); //probably there's a better exception you could throw or you can define your own.
   }
...

La persona que llama se vería así:

  try{
        auto images = ProcessImage(myFilePath)
  }
  catch(const std::invalid_argument& e ) { 
     // write something to console, log the exception, terminate your process... choose your poison.
  }
  1. Devuelve un código de error. Hay varias formas de hacer esto: devolver una tupla con el primer elemento como código de error y el segundo como vector, o pasar el vector por referencia y devolver solo el código de error:
// if successful the function will return 0.
enum ErrorCode
{
  Successful = 0,
  InvalidArgs = 1,
  ...
}

ErrorCode ProcessImages(const boost:filesystem::path filePath, std::vector<Mat>& outImages)
{
   if (!boost::filesystem::is_regular_file(pickPath)) {
   {
    return InvalidArgs;
   }

   imageFile = imread(pickPath.string());

   outImages.insert(img1);
   outImages.insert(img2);

   return Successful;
}

int main(){
    path = "img.jpeg"
    std::vector<Mat> images;
    auto result = ProcessImages(path, images);
    if (result != Successfull)
    {
      //error
    }
}
2
Claudiu Guiman 9 dic. 2019 a las 12:07

Creo que puede usar vector<Mat> y enviar todas las imágenes a este vector y devolverlo. Luego puede verificar la longitud de este vector después de llamar a la función. Si es cero, eso significa que no presionó nada (si no se encuentra ningún archivo en la ruta). De lo contrario, extraiga todas las imágenes del vector como desee.

0
Ajay Dabas 9 dic. 2019 a las 11:57