设计一个接受通用输出流作为参数的API

Designing an API to accept a generic output stream as a parameter

本文关键字:输出流 参数 API 一个      更新时间:2023-10-16

我正在使用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从这个链接的第665行开始记录

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

以下是CodeGen/AsmPrinter/AsmPrinter.cpp的代表性示例:

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