可能重复:
重载运算符 - >
嗨,
我已经看到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) 我正在使用 SOCK_SEQPACKET 连接,确保通过单个 write()/send() 调用发送整个缓冲区对我来说至关重要。我还使用设备驱动程序,该驱动程序旨在通过单个调用处理完整的数据块。同时我想处理 write()/send() 由于缓冲区溢出而阻塞的情况,即我想得到一个反馈,即当前的实现是否在这里遇到瓶颈。我正在使用 glibc,Linux 2.6。
我需要实现一个接受缓冲区的方法,它要么完全发送缓冲区,要么指示由于阻塞(即系统缓冲区溢出)而失败。
看起来使用 send(..., MSG_DONTWAIT)/fcntl(..., O_NONBLOCK) 不是解决方案,因为它们在报告 EWOULDBLOCK/EAGAIN 之前接受部分写入。有没有办法检查传出缓冲区中是否有足够的空间,或者是否有专用的写入完成或失败方法?
或者,是否可以通过其他方式检测块?例如,定时器+信号似乎是一个选项,但我不喜欢为每次写入设置它的想法。
先感谢您。
我使用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指令中的主要版本?如果没有,定义主要/次要号码的首选方式是什么?
首先,我会写一些例子来正确解决这个问题.
首先,我将声明用于创建单例对象的模板(不是自动创建的): 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.cpp和child2.cpp中实现了Child的实现.
child1.cpp
void Child1::staticInvokeOne()
{ …Run Code Online (Sandbox Code Playgroud)