gpt4 book ai didi

c++ - 使用 ostream 标志作为详细调试标志

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:38 25 4
gpt4 key购买 nike

我正在尝试重载流运算符作为我代码中各种对象的诊断工具。理想情况下,我希望能够使用这些流修改器标志即时修改流,但是这些非常有限,我真的不想在我的每个对象中添加 setVerbose 标志。我最终得到了以下相当糟糕但可行的解决方案

#include <iostream>
#include <string>
#include <vector>

struct StructA {
std::string mLongName;
std::string mShortName;
inline friend std::ostream& operator << (std::ostream& os, const StructA& rStruct) {
// I dont know how to use a generic verbose flag - so use this - very bad idea
// but perhaps the stackoverflow people can help out with a good suggestion
if (os.flags() & os.skipws) {
os << rStruct.mShortName << std::endl;
} else {
os << rStruct.mLongName << std::endl;
}
return os;
}
};

int main()
{
StructA test {"Verbose Name", "Short Name"};
std::cout << test << std::noskipws << test << test << std::skipws << test;
}

我创建了上面的 live example为了证明我的观点,它打印了以下输出:

Short Name
Verbose Name
Verbose Name
Short Name

如您所见,我使用了一个完全不合适的“skipws”流修饰符标志作为穷人的 1 级详细标志——这只是为了显示我一直在寻找的流内方法,没有 havnig 添加成员对象我的每个可打印对象(欢迎所有关于更好方法的建议,但我想尽量减少对每个可打印对象的更改——因为我有很多)。其次,该标志是持久的,直到稍后重置 - 其他一些流标志仅适用于下一个流运算符(operator),但我不确定它是如何工作的,第三

最佳答案

您可以在流实例中存储自定义状态:

查看 Live On Coliru

#include <iostream>

static int const index = std::ios_base::xalloc();

std::ostream& verbose(std::ostream& stream) {
stream.iword(index) = 1;
return stream;
}

std::ostream& noverbose(std::ostream& stream) {
stream.iword(index) = 0;
return stream;
}

struct StructA {
std::string mLongName;
std::string mShortName;

inline friend std::ostream& operator << (std::ostream& os, const StructA& rStruct) {
switch (os.iword(index)) {
case 1: return os << rStruct.mLongName;
case 0:
default: return os << rStruct.mShortName;
}
}
};

int main()
{
StructA a;
a.mLongName = "loooooooooooooooooooong names are tedious";
a.mShortName = "succinctness";

std::cout << a << '\n';

std::cout << verbose;
std::cout << a << '\n';

std::cout << noverbose;
std::cout << a << '\n';
}

学分转到Dietmar Kühl's answer .

如果您需要大量的状态/逻辑,您将不得不考虑注入(inject)自定义语言环境方面。他的回答也展示了这种方法的基础。

关于c++ - 使用 ostream 标志作为详细调试标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23549290/

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