【问题标题】:Designing an API to accept a generic output stream as a parameter设计 API 以接受通用输出流作为参数
【发布时间】:2013-05-09 16:36:28
【问题描述】:

我正在使用 LLVM 库设计一个 API,该库将接受输出流作为其构造函数参数之一。 LLVM 编码标准规定如下:

使用 raw_ostream

LLVM 包含一个轻量级、简单且高效的流 llvm/Support/raw_ostream.h 中的实现,它提供了所有 std::ostream 的共同特征。所有新代码都应该使用 raw_ostream 而不是 ostream。

与 std::ostream 不同,raw_ostream 不是模板,可以转发 声明为类 raw_ostream。公共标头通常不应 包括 raw_ostream 标头,但使用前向声明和 对 raw_ostream 实例的常量引用。

我必须遵守 LLVM 编码标准,因此我尝试在构造函数中接受 raw_ostream 作为参数。我尝试通过引用和指针传递 raw_ostream,但在编译时收到以下错误消息:

注意:候选构造函数不可行:没有已知的转换 'llvm::raw_ostream &()' 到 'llvm::raw_ostream &'...

我的构造函数应该是什么样子来接受“llvm::raw_ostream &()”类型的参数?我想为此输出流初始化一个类成员。

这是我当前的代码:

构造函数

MyClass(raw_ostream &OS) : OutputStream(OS) {}

来电者

MyClass x = new MyClass(&outs);

outs 记录在 this link 的第 665 行开始

【问题讨论】:

  • 显示你现有的构造函数。
  • MyClass(const raw_ostream &OS) : OutputStream(OS) {}
  • 你确定它应该是 const 吗?
  • OutputStreamraw_ostreamraw_ostream & ?
  • 我认为我的问题是我需要传递outs() 作为构造函数参数而不是&outs。现在可以了!

标签: c++ llvm llvm-c++-api


【解决方案1】:

在 LLVM 源代码中有大量示例,其中 raw_ostream 是函数/方法参数。几乎总是(..., raw_ostream &OS, ...)

这是来自CodeGen/AsmPrinter/AsmPrinter.cpp的一个代表性例子:

static void emitComments(const MachineInstr &MI, raw_ostream &CommentOS) {
  // ... code
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2022-10-06
    • 2019-07-14
    相关资源
    最近更新 更多