ADD: composite-op, missing the non-separable operations though
CHANGE: use C++11