现代C++神器之literals

Modern C++有很多理念极具启发性。我个人很欣赏std::chrono::duration的设计,比如说它的构造方式:

milliseconds t1(15);
hours t2 = hours(2);
auto t3 = hours(10);
milliseconds t4(minutes(2));
milliseconds t5 = hours(1);

上面几种都是普通的初始化,后两个会转换不同格式的数据。但是呢:

minutes t6 = 14min;
hours t7 = 2h;

这又是什么?为什么编译通过?那两个后缀竟然合法?不仅如此:

auto t8 = 12s;
milliseconds t9 = 3min;

这两个也是合法的。 Continue reading 现代C++神器之literals

C++之无聊小技巧二

接下来扯一点设计模式。一般的业务框架会包含大量的模板方法模式,它的目的主要是为了复用代码。看个简单例子:

struct SessionManager {
  void execute() {
    open();
    run();
    close();
  }
private:
  void open() { cout << "session start" << endl; }
  void close() { cout << "session end" << endl; }
  virtual void run() { cout << "run" << endl; }
};
struct Printer : SessionManager {
  void run() { cout << "print ABC" << endl; }
};
int main() { 
  SessionManager *a = new Printer(); 
  a->execute();
/*
print: 
  session start
  print ABC
  session end
*/
}

Continue reading C++之无聊小技巧二

C++之无聊小技巧

通用编程语言的基本特性都相差不远,同时也各有各的玩法。C++特性之多首屈一指,各种其他语言看不到的玩法,当然其实用性也有限。本文简单探讨一些无聊并有趣的技巧,特性或者Idiom。演示这些的目的在娱乐,并不建议在工程中使用。

诊断

C语言本身就有assert(),不过没有输出信息。C++11又加上static_assert(),支持输出信息。
在这之前可以自己实现带输出的诊断:

#define m_assert(condition, message){ \
  if ( !(condition) ) {  \
    print("Assertion failed:", message);  \
    exit(-1); \
  }  \
}  \

或者这样:


assert(condition && message)

Continue reading C++之无聊小技巧