c++abseil

Template class as function's return type mismatch


static absl::StatusOr<ImageFrame> ReadTextureFromFile() {
      ImageFrame image_frame(width, height);
      return image_frame;
}

Why return type is ImageFrame and not absl::StatusOr<ImageFrame>?


Solution

  • This is just a "syntactic sugar". The return type is abseil::StatusOr<ImageFrame>. abseil::StatusOr<T> allows you to return both abseil::Status and the type T from your function. When there is an error you can directly return the error status. On success, you return the object with type T.

    So you could also write something like that:

    static absl::StatusOr<ImageFrame> ReadTextureFromFile() {
          try {
              ImageFrame image_frame(width, height);
          }
          catch{
              return absl::AbortedError("Could not create image frame.");
          }
          return image_frame;
    }
    

    When you call this function, you need to check if everything went smooth.

    auto image_frame_or = ReadTextureFromField();
    ImageFrame image_frame;
    if (image_frame_or.ok()){
        image_frame = image_frame_or.value();
    }