use boost::declval