小编pet*_*rpi的帖子

我应该使用另一个的streambuf创建一个临时的ostream吗?

假设我有一个带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)

c++ iostream streambuf

10
推荐指数
1
解决办法
221
查看次数

在移动构造函数中抛弃constness是否可以接受?

假设我有一个类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++ const move-semantics c++11

8
推荐指数
1
解决办法
372
查看次数

将 C# 属性应用于多个字段

假设我有一个最小的 C# 类,如下所示:

class Thing
{
    private float a, b, c, d;
    (...)
}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以将一个属性应用到所有四个字段而不必写四次?如果我放在[SomeAttribute]前面private,它似乎a只适用于。

c#

4
推荐指数
1
解决办法
740
查看次数

将printf重定向到fopencookie

在Linux上(Raspberry Pi上的Raspbian)我想这样做,以便我的C应用程序打印使用的任何内容都会printf在回调中发回给我.

(不,我不是在谈论shell重定向> some_file.txt.我正在谈论一个C程序自己决定发送stdout(因此printf)在同一个程序中的回调.)

(是的,我确实想要这样做.我正在使用OpenGL制作全屏程序,并希望printf使用我自己的渲染代码在该程序中向用户呈现任何文本.printf用其他东西替换所有调用是不可行.)

我觉得这应该很容易.StackOverflow上已经存在这个问题的变体,但我找不到的都是完全一样的.

我可以fopencookie用来获得一个FILE*最终调用我的回调.到现在为止还挺好.挑战是去stdoutprintf去那里.

无法使用,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 printf glibc stdio raspbian

3
推荐指数
1
解决办法
162
查看次数

如何获取右值参考参数并将其传递给其他地方?

我是一个相当称职的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用法加强装备.

我还有一个类,它保持了vectorFoo:

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)

c++ move-semantics c++11

1
推荐指数
1
解决办法
69
查看次数

标签 统计

c++ ×3

c++11 ×2

move-semantics ×2

c ×1

c# ×1

const ×1

glibc ×1

iostream ×1

printf ×1

raspbian ×1

stdio ×1

streambuf ×1