我重载了 <<
打印自定义对象(在本例中为自定义类的实例 Vertex
)。作为其中的一部分,我想以二进制形式打印给定的整数。出于多种原因,我更喜欢 std::bitset
而不是运行 for 循环,但我遇到的问题是我有一个特定的大小,每个二进制文件应该取决于实例。这是片段:
std::ostream &
operator<< (std::ostream& os, const Vertex& V) {
os << "(" << std::bitset<4>(V.signature()) << ") :";
for (int e=2; e<V.degree(); ++e) {
os << " [" << e << "]=" << V.neighbor(e) << " ";
}
return os;
}
代替 4
,我真的很想放一个size_t
这取决于 V
.例如,这是我尝试过的:
std::ostream &
operator<< (std::ostream& os, const Vertex& V) {
size_t B = V.degree()-1;
os << "(" << std::bitset<B>(V.signature()) << ") :";
for (int e=2; e<V.degree(); ++e) {
os << " [" << e << "]=" << V.neighbor(e) << " ";
}
return os;
}
错误显示为“非类型模板参数不是常量表达式”。有没有办法在不对参数进行硬编码的情况下解决这个问题?这不是在编译时就会知道的东西。
最佳答案
一个简单的函数怎么样:
string bin_format(int_type value, size_t len);
然后您使用它写入流
out << bin_format(v.signature(), v.degree()-1);
超出此范围的任何内容都违反了 KISS 原则,需要仔细证明其合理性。例如。如果你设法经常重复 string
中的动态分配导致问题,您可以编写一个函数获取流和参数并将单个位写入流,或者您可以返回一个具有重载 operator<<
的代理。该运算符(operator)在哪里进行格式化和流式传输。顺便说一句,您还可以将该函数转换为基于整数类型的模板,这样您至少可以在所需的位数上设置最大值。
关于c++ - 以固定长度打印二进制整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29499616/