using c++11 type traits