C++ 的 idioms(十三)

virtual constructor

这个 idiom 的意思是说定义一个抽象类,定义两个接口用于返回该类的对象指针,如 create 与 clone 分别对应一般的构造函数和 copy constructor。子类对其进行实现,但是返回的是子类对象的指针。这样可行是因为所谓的 covariant return type,但是对智能指针来说,由于没有继承关系,所以并不能 wrap。

named loop

其实是个很 ws 的 macro

#define named(blockname) goto blockname; \
                         blockname##_skip: if (0) \
                         blockname:

#define break(blockname) goto blockname##_skip

这样如下使用时由于有个 if (0) 就会跳过后面的循环。

named(foo)
for ( ... ) {
  if (...)
     break(foo) ;
}

nifty counter

当我们为某些库定义一些 static 对象的时候(比如 std::cout 等),需要确保这些对象能够正确的被初始化(调用构造函数)。如何放置这部分代码是比较有讲究的,因为用户可能在多个编译单元使用这些 static 对象。nifty counter 就是为了解决这个问题提出来的一种策略。首先我们需要在静态对象的类声明处做点手脚,埋伏另一个静态对象。

// in h/hpp file
class you_type_that_has_static_objs {
  friend struct your_type_static_init ;
  // ...
} ;
static struct your_type_static_init {
  your_type_static_init () ;
  ~your_type_static_init () ;
} initializer ;

任何希望声明 your_type_that_has_static_objs 的静态对象时,必须 include 此头文件(不允许前向声明)。这样一来,只要声明或者使用静态对象 your_type_that_has_static_objs 都会在此之前声明了另外一个 your_type_static_init 的 static 对象。然后一般说来库会有一个编译单元实现这里的 your_type_static_init

// in cpp
static int nifty_counter ;

your_type_static_init::your_type_static_init () {
  if (0 == ++ nifty_counter) {
    // initialize static you_type_that_has_static_objs
  }
}

your_type_static_init::~your_type_static_init () {
  if (0 == nifty_counter --) {
    // destruct you_type_that_has_static_objs
  }
}

noncopyable

这个东西在 boost 里面也有(boost/noncopyable.hpp),

class noncopyable {
protected:
  noncopyable() {}
  ~noncopyable() {}
private:  // emphasize the following members are private
  noncopyable( const noncopyable& );
  const noncopyable& operator=( const noncopyable& );
};

比较有意思的是可以写个 CRTP 的版本,虽然没觉得比这个有多少用,一般通过 private 继承就行了。

non-virtual interface

这是一种 template method 的典型应用,template method 实现的接口,其中调用相关的虚函数,这样子类即便 override,在使用父类指针调用该接口时仍然保持原先的 template。

class base {
protected:
  virtual void impl1 () ;
  virtual void impl1 () ;
public:
  void interface () {
    impl1 () ;
    impl2 () ;
  }
} ;

class derived : public base {
protected:
  virtual void impl1 () {
    // implementation goes here
  }
} ;

——————
And he said to him, I am the LORD that brought you out of Ur of the Chaldees, to give you this land to inherit it.

Advertisements
C++ 的 idioms(十三)

一个有关“C++ 的 idioms(十三)”的想法

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s