Going Native 2013

Herb Sutter had a couple of favorite C++ few-liners. Watch the video here: My Favorite C++ 10-liner.

A complete reference-counted object cache.

From C++98 it uses map operator[]'s auto-insertion.

From C++11 it uses:

  • auto
  • mutex, lock_guard
  • Thread-safe fn statics
  • shared_ptr and weak_ptr
  • Thread-safe.lock()
widget_cache.cpp
shared_ptr<widget> get_widget( int id ) {
    static map< int, weak_ptr<widget> > cache;
    static mutex m;
 
    lock_guard<mutex> hold(m);
    auto sp = cache[id].lock();    // cache[id] returns a weak_ptr. lock() returns the shared_ptr
    if( !sp )
        cache[id] = sp = load_widget(id);
    return sp;
}

In C++11, the following code is thread safe! It's the Meyers Singleton.

  • Thread safe fn statics
  • Does destruction. No need for Alexandrescu's various destruction policies anymore!
thread_safe_meyers_singleton.cpp
widget& instance() {
    static widget w;
    return w;
}

This one uses the Cinder C++ Library.

gui_app.cpp
#include "cinder/app/AppBasic.h"
#include "cinder/dx/dx.h"
#include <vector>
using namespace ci;
using namespace ci::app;
 
class MyApp:public AppBasic {
    std::vector< Vec2f > points;
public:
    void mouseDrag( MouseEvent e ) {
        points.push_back( e.getPos() );
    }
 
    void draw() {
        dx::clear( Color( 0.1f, 0.1f, 0.15f ) );
        dx::color( 1.0f, 0.5f, 0.25f );
        dx::begin( GL_LINE_STRIP );
        for( auto& e: points )
          dx::vertex( e );
        dx::end();
    }
};
 
CINDER_APP_BASIC( MyApp, RendererDx )
cplusplus/goingnative2013.txt · Last modified: 2013/09/18 10:14 by dblume
 
Recent changes RSS feed Driven by DokuWiki