小编nyr*_*yrl的帖子

运算符 - >"链接"指针吗?

可能重复:
重载运算符 - >

嗨,

我已经看到operator->()它在被评估后被链接(重新应用),例如:

struct Bar
{
  Bar() : m_str("Hello world!") {}
  const string* operator->() const { return &m_str; }
  string m_str;
};

struct Foo
{
  const Bar& operator->() const { return m_bar; }
  Bar m_bar;
};

int main()
{
  Foo f;
  cout << f->c_str() << endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

工作得很好,这需要三个operator->()进行评估- Foo::operator->(),Bar::operator->()和普通指针分辨率.

但它不适用于中间的Foo::operator->()指针- 如果返回指向Bar而不是引用的指针,它就不会编译.auto_ptr<auto_ptr<string>> 例如,同样如此.

它是否特定于非重载,operator->()因此它只应用一次而不会导致链接?可以在不使用的情况下使代码低于工作(*ptr2)-> ...吗?

int …
Run Code Online (Sandbox Code Playgroud)

c++ method-chaining operator-keyword

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

检查 write()/send() 是否可以无阻塞地处理整个缓冲区,否则失败(无部分写入)

我正在使用 SOCK_SEQPACKET 连接,确保通过单个 write()/send() 调用发送整个缓冲区对我来说至关重要。我还使用设备驱动程序,该驱动程序旨在通过单个调用处理完整的数据块。同时我想处理 write()/send() 由于缓冲区溢出而阻塞的情况,即我想得到一个反馈,即当前的实现是否在这里遇到瓶颈。我正在使用 glibc,Linux 2.6。

我需要实现一个接受缓冲区的方法,它要么完全发送缓冲区,要么指示由于阻塞(即系统缓冲区溢出)而失败。

看起来使用 send(..., MSG_DONTWAIT)/fcntl(..., O_NONBLOCK) 不是解决方案,因为它们在报告 EWOULDBLOCK/EAGAIN 之前接受部分写入。有没有办法检查传出缓冲区中是否有足够的空间,或者是否有专用的写入完成或失败方法?

或者,是否可以通过其他方式检测块?例如,定时器+信号似乎是一个选项,但我不喜欢为每次写入设置它的想法。

先感谢您。

c++ nonblocking send

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

如何在autoconf中定义共享库主要版本?

我使用autoconf/automake/libtool来构建共享库.我想将主要数量的库版本传递给共享库soname.

我在configure.ac中有以下声明:

AC_INIT([libabc], [1.1.0])
Run Code Online (Sandbox Code Playgroud)

以下Makefile.am:

AM_CPPFLAGS              = -I$(top_srcdir)/include -Wall -Wextra
LDADD                    = libabc.la

lib_LTLIBRARIES          = libabc.la
nodist_libabc_la_SOURCES = $(top_srcdir)/config.h
libabc_la_SOURCES        = $(top_srcdir)/src/abc.c
Run Code Online (Sandbox Code Playgroud)

我可以为配置脚本,源和共享库soname提供相同的版本.我可以在源代码中使用自动生成的config.h中定义的VERSION或PACKAGE_VERSION,但这不会影响soname,它总是libabc.so.0.

有没有办法强制libtool使用AC_INIT指令中的主要版本?如果没有,定义主要/次要号码的首选方式是什么?

autotools shared-libraries libtool

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

静态模板数据成员存储

首先,我会写一些例子来正确解决这个问题.

首先,我将声明用于创建单例对象的模板(不是自动创建的): singleton_base.h

template <class Derived>
class SingletonBase
{
  public:
    static Derived* instance() { assert(s_instance); return dynamic_cast<Derived*>(s_instance); }
  protected:
    SingletonBase() { assert(s_instance==0); s_instance=this; }
    virtual ~SingletonBase() { assert(s_instance); s_instance=0; }
  private:
    static SingletonBase* s_instance;
};

template <class Derived>
SingletonBase<Derived>* SingletonBase<Derived>::s_instance = 0;
Run Code Online (Sandbox Code Playgroud)

现在我们可以声明从模板派生的任何类,并且每个派生类都应该有自己的s_instance.例如:

child1.h

class Child1 : public SingletonBase<Child1>
{
  ...
  void doSomething();
  static void staticInvokeOne();
};
Run Code Online (Sandbox Code Playgroud)

child2.h

class Child2 : public SingletonBase<Child2>
{
  ...
  void doSomethingElse();
  static void staticInvokeBoth();
};
Run Code Online (Sandbox Code Playgroud)

我也分别在child1.cppchild2.cpp中实现了Child的实现.

child1.cpp

void Child1::staticInvokeOne()
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates static-members

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