use ext::is_smart_pointer to conditionally enable/disable the templated constructors