【问题标题】:C++, template class as function's return type problemC++,模板类作为函数的返回类型问题
【发布时间】:2022-07-22 20:18:54
【问题描述】:
static absl::StatusOr<ImageFrame> ReadTextureFromFile() {
      ImageFrame image_frame(width, height);
      return image_frame;
}

为什么返回类型是 ImageFrame,而不是 absl::StatusOr ?

【问题讨论】:

  • 它是absl::StatusOr&lt;ImageFrame&gt;。没关系,如果失败,你可能会得到数据ImageFrame或状态码。
  • 您可能想阅读Absil's document
  • 返回类型为absl::StatusOr&lt;ImageFrame&gt;。但是,看起来,这种类型的对象可以被另一个ImageFrame 类型的对象初始化(可能带有转换构造函数)。
  • 这是程序员需要知道什么是 monad 的又一个例子。 /咆哮

标签: c++


【解决方案1】:

返回类型是函数签名中指定的absl::StatusOr&lt;ImageFrame&gt;

但是查看definition of absl::StatusOr,有一个转换构造函数将T 类型的对象移动到absl::StatusOr&lt;T&gt;,所以你的代码就像你写的一样被执行

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

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

【讨论】:

    【解决方案2】:

    这只是一个“语法糖”。返回类型为abseil::StatusOr&lt;ImageFrame&gt;abseil::StatusOr&lt;T&gt; 允许您从函数中返回 abseil::Status 和类型 T。当出现错误时,您可以直接返回错误状态。成功后,您返回类型为 T 的对象。

    所以你也可以这样写:

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

    调用此函数时,需要检查是否一切顺利。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 2021-10-10
      • 2021-03-23
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多