gpt4 book ai didi

c++ - 类型为 "has << operator"的参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:11 24 4
gpt4 key购买 nike

我需要在输出流上绘制我的对象,通常是 cout .但我也希望用户能够输入任何具有 << 的流运算符(例如 QTextStream ),因此不必是 cout每次。定义此类参数的最简单方法是什么?

所以这就是我想要的,一些可编译的东西:

virtual void draw(GeneralOutStream out = std::cout)
{
out << m_name << std::endl;
}

我知道我可以使用模板,(这就是我正在做的事情。) 但我希望有一个不需要模板的解决方案。但是,模板解决方案工作正常,所以基本上我只是好奇。

最佳答案

我可以想到四种方法。

首先,取std::ostream作为你的GeneralOutStream ,并假设每个人都继承了它。也许写一些包装 QTextStream 的东西以使其成为std::ostream的方式.

其次,写一个template采用 GeneralOutStream&& out 的方法并对其进行操作。这需要在标题中公开您的实现。我会推荐这个。相当强烈,但这确实意味着virtual最终变得毫无用处。

三、写类型删除GeneralOutStream它公开了您想在类(class)中使用 template 与之交互的一般流出部分将传入的泛型类型存储在 pImpl 中的构造函数与 virtual方法,然后在对象的实现中使用该类型。这具有运行时开销并且编写起来非常棘手,并且类似于 std::function 的模式。 -- 除了 GeneralOutStream必须处理能够编写大量类型的问题!

如果我要写#3,GeneralOutStream将是 template它采用一系列类型 GeneralOutStream应该处理,然后进行一些元编程以将这些重载准确地暴露给<< .这变得非常棘手,因为您需要手动复制重载解析。

第四,创建您要支持的“GeneralOutStream”类型的枚举。使用双分派(dispatch)技术通过 virtual 传递对这些类型实例的引用方法调用,在另一端将它们分开并调用您的实现 template方法,要求实现类处理整个枚举。这个实现起来比#3 稍微简单一些,它限制了你可以传递给 draw 的类型。方法,但允许完全访问实现中的类型 class .

关于c++ - 类型为 "has << operator"的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17150892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com