Template class as function's return type mismatch

537 views Asked by At
static absl::StatusOr<ImageFrame> ReadTextureFromFile() {
      ImageFrame image_frame(width, height);
      return image_frame;
}

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

2

There are 2 answers

0
Berkay Berabi On BEST ANSWER

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();
}
0
CompuChip On

The return type is absl::StatusOr<ImageFrame> as specified in the signature of the function.

But looking at the definition of absl::StatusOr, there is a converting constructor that moves an object of type T into a absl::StatusOr<T> so your code is executed as if you wrote

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

      // Call absl::StatusOr(U&&)
      absl::StatusOr<ImageFrame> returnValue{ image_frame };
      return returnValue;
}