假设我有一个带ostream &参数o并写入该ostream 的函数.的operator <<实现将是一个很好的例子.
ostream& operator << (ostream& o, const MyThing& t)
{
// ... interesting code here ...
return o;
}
Run Code Online (Sandbox Code Playgroud)
在函数中,我可能想要在流上指定格式化选项.例如,我可能希望将数字打印为十六进制,无论在o传递给函数时如何配置.
其次,我可能希望能够对当前的格式化标志做出假设.例如,除非我另有要求,否则能够假设数字被格式化为十进制将是很好的.
最后,当函数退出时,我希望格式化选项o与调用函数之前的格式化选项相同,以便对调用者不变.这只是打电话者礼貌的问题.
到目前为止,我已经通过ostringstream在函数中创建一个本地,完成所有工作(包括设置格式化选项),并在函数结束时发送到目标.str()来实现o这一目标. 这里的StackOverflow问题表明,比我聪明的人采取相同的方法. 然而,令我困扰的是,我在ostringstreams中保留了大量数据,这些数据可能会更早地发送到输出(字符串可能变得非常大).
我有两个问题:
1)创建一个临时的(基于堆栈的)ostream 并在那个ostream上做我的工作是合法的,惯用的,良好的形式等o.rdbuf()吗?我自己的测试和cppreference.com上的页面似乎表明我可以.
ostream& operator << (ostream& o_, const MyThing& t)
{
ostream o (o_.rdbuf());
// write stuff to "o",
// setting formatting options as I go.
return o_; // …Run Code Online (Sandbox Code Playgroud) 假设我有一个类Foo,它有一个指向Bar的私有指针:
class Foo
{
private:
Bar * bar;
public:
Foo () : bar (new Bar ())
{}
~Foo ()
{
delete bar;
}
};
Run Code Online (Sandbox Code Playgroud)
如果指针bar永远不会被重新分配给不同的实例,那么const为了阻止我(或维护者)在将来这样做而使指针本身是有意义的:
private:
Bar * const bar;
Run Code Online (Sandbox Code Playgroud)
我喜欢在机会出现的地方这样做.
如果我想编写一个移动构造函数,它看起来像这样:
Foo (Foo && f) :
bar (f.bar)
{
f.bar = NULL; // uh oh; f.bar is const.
}
Run Code Online (Sandbox Code Playgroud)
我可以通过抛弃const f.bar或者首先不使const成为"使错误消失" .这些都不是我想要做的事情.我宁愿不完全删除const因为它是有原因的.另一方面,扔掉constness ring为我敲响了警钟,这是我从未经常做过的事情.我的问题是:在这样的移动构造函数中抛弃const是否被认为是可以接受的做法?有没有更好的方式我没有考虑过?
我不认为我的问题与此问题相同:使用const_cast实现移动构造函数
假设我有一个最小的 C# 类,如下所示:
class Thing
{
private float a, b, c, d;
(...)
}
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以将一个属性应用到所有四个字段而不必写四次?如果我放在[SomeAttribute]前面private,它似乎a只适用于。
在Linux上(Raspberry Pi上的Raspbian)我想这样做,以便我的C应用程序打印使用的任何内容都会printf在回调中发回给我.
(不,我不是在谈论shell重定向> some_file.txt.我正在谈论一个C程序自己决定发送stdout(因此printf)在同一个程序中的回调.)
(是的,我确实想要这样做.我正在使用OpenGL制作全屏程序,并希望printf使用我自己的渲染代码在该程序中向用户呈现任何文本.printf用其他东西替换所有调用是不可行.)
我觉得这应该很容易.StackOverflow上已经存在这个问题的变体,但我找不到的都是完全一样的.
我可以fopencookie用来获得一个FILE*最终调用我的回调.到现在为止还挺好.挑战是去stdout和printf去那里.
我无法使用,freopen因为它需要一个字符串路径.在FILE*我想重定向到是不是文件系统中的文件,而只是在运行时存在.
我无法使用,dup2因为FILE*from fopencookie没有文件描述符(fileno返回-1).
在glibc的文件表明,我可以简单地重新分配stdout给我的新FILE*:"标准输入,标准输出,和stderr都是你可以设置就像任何其他正常的变数." .这几乎可以工作.任何印有fprintf (stdout, "whatever") 没有去我的回调,所以做任何printf有任何格式说明.但是,任何printf使用没有格式说明符的字符串的调用仍然会转到"原始"标准输出.
我怎样才能实现我想做的事情?
PS:我不关心便携性.这只会在我当前的环境中运行.
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <stdarg.h>
#include …Run Code Online (Sandbox Code Playgroud) 我是一个相当称职的C++用户(不是一个完整的菜鸟).我有一个充当资源句柄的类.这个类有一个移动构造函数和复制construtor被删除是有道理的:
struct Foo {
Foo (int i) : // For sake of example.
x(i)
{}
Foo (Foo && f) :
x(f.x)
{
f.x = 0; // 0 is special and means "moved from".
}
Foo (const Foo & f) = delete;
private:
int x;
};
Run Code Online (Sandbox Code Playgroud)
多年来我一直以货物崇拜的方式做这件事而且工作正常.现在我正试图用我的C++ 11用法加强装备.
我还有一个类,它保持了vector的Foo:
struct Bar { // (Constructor added below)
std::vector<Foo> foos;
};
Run Code Online (Sandbox Code Playgroud)
我想写一个构造函数,用于Bar调用者传入的位置vector<Foo>.我想将调用者提供的整个向量移入Bar.foos.我想通过使构造函数参数vector<Foo>&&而不是普通参数使调用者明确vector<Foo>&.这样,调用者必须std::move将vector插入到构造函数中.
int main (int …Run Code Online (Sandbox Code Playgroud)