::std::is_copy_constructible
类型特征不是100%准确。例如,::std::vector<::std::unique_ptr<int> >
不是可复制构造的,但无论如何都会被类型特征指定为。有没有一种方法可以提供比我们在标准库中找到的更智能的可复制构造特征,以及在任何C ++版本中如何?演示代码与标准类型特征具有相同的问题。
template <typename T, typename = void>
struct smart_cc : ::std::false_type
{
};
template <typename T>
struct smart_cc<T,
decltype(void(T(::std::declval<T const&>())))
> : ::std::true_type
{
};
int main()
{
::std::cout << ::std::is_copy_constructible<::std::vector<::std::unique_ptr<int> > >{} << ::std::endl;
::std::cout << smart_cc<::std::unique_ptr<int> >{} << ::std::endl;
::std::cout << smart_cc<::std::vector<::std::unique_ptr<int> > >{} << ::std::endl;
::std::cout << smart_cc<int>{} << ::std::endl;
::std::vector<::std::unique_ptr<int> > u;
//::std::vector<::std::unique_ptr<int> > v(u);
return 0;
}
最后,我选择了这个:
template <typename T, typename = void>
struct is_copy_assignable : ::std::is_copy_assignable<T>
{
};
template <typename T>
struct is_copy_assignable<T,
decltype(void(sizeof(typename T::value_type)))
> : is_copy_assignable<typename T::value_type>
{
};
template <typename T, typename = void>
struct is_move_assignable : ::std::is_move_assignable<T>
{
};
template <typename T>
struct is_move_assignable<T,
decltype(void(sizeof(typename T::value_type)))
> : is_move_assignable<typename T::value_type>
{
};
template <typename T, typename = void>
struct is_copy_constructible : ::std::is_copy_constructible<T>
{
};
template <typename T>
struct is_copy_constructible<T,
decltype(void(sizeof(typename T::value_type)))
> : is_copy_constructible<typename T::value_type>
{
};
template <typename T, typename = void>
struct is_move_constructible : ::std::is_move_constructible<T>
{
};
template <typename T>
struct is_move_constructible<T,
decltype(void(sizeof(typename T::value_type)))
> : is_move_constructible<typename T::value_type>
{
};