首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将C++流操纵器链接到单个变量

将C++流操纵器链接到单个变量
EN

Stack Overflow用户
提问于 2020-03-06 18:36:21
回答 2查看 78关注 0票数 2

我在ofstream中链接了一些流操纵器,如下所示:

代码语言:javascript
运行
复制
std::string filename = "output.txt";
std::ofstream outputFile;
outputFile.open(filename, std::ios::trunc);
outputFile << std::setw(5) << std::scientific << std::left << variable;

有没有可能这样做?

代码语言:javascript
运行
复制
std::string filename = "output.txt";
std::ofstream outputFile;
outputFile.open(filename, std::ios::trunc);
std::ostream m;
m << std::setw(5) << std::scientific << std::left;   // Combine manipulators into a single variable
outputFile << m << variable;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-06 18:43:56

流操纵器只是一个函数,流通过其中一个operator <<重载(链接中的10-12)调用它自己。你只需要声明一个这样的函数(或者可以转换成合适的函数指针):

代码语言:javascript
运行
复制
constexpr auto m = [](std::ostream &s) -> std::ostream& {
    return s << std::setw(5) << std::scientific << std::left;
};
std::cout << m << 12.3 << '\n';

See it live on Wandbox

票数 4
EN

Stack Overflow用户

发布于 2020-03-06 18:41:45

您可以编写自己的操纵器:

代码语言:javascript
运行
复制
struct my_manipulator{};

std::ostream& operator<<(std::ostream& o, const my_manipulator& mm) {
     o << std::setw(5) << std::scientific << std::left;
     return o;
};

这将允许您编写

代码语言:javascript
运行
复制
outputFile << my_manipulator{} << variable;

PS: Io-操纵器修改流的状态。因此,它不能完全按照您要求的方式工作。您正在修改m的状态。将状态从一个流转移到另一个流是可能的,但比必要的复杂。

注意:注意我定义自定义io-manipulator的方式是可以的,但是要查看更符合流操纵器精神的实现,请参阅this answer (通常io-manipulator是函数,我使用了一个标签,它需要更多一点的样板)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60562269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档