部分特化类型特征时如何使用 std::decay ?
How can I use std::decay when partially specializing a type trait?
我制作这些类型特征是为了确定类型是否是动态容器,但最近 运行 当对向量的引用不正确时 return 陷入混乱。
template<typename T>
struct is_dynamic_container
{
static const bool value = false;
};
template<typename T , typename Alloc>
struct is_dynamic_container<std::vector<T , Alloc>>
{
static const bool value = true;
};
我想我需要使用 std::decay
,但我无法确定是否可以像这样而不是在调用站点来完成。
template<typename T , typename Alloc>
struct is_dynamic_container<std::decay<std::vector<T , Alloc>>::type>
{
static const bool value = true;
};
^^这不行。
我只想写 is_dynamic_container<std::vector<int>&>
而不是 is_dynamic_container<std::decay<std::vector<int>&>::type>
。这可能吗?
你可以试试这个:
template<typename T,typename=void>
struct is_dynamic_container
{
static const bool value = false;
};
template<typename T>
struct is_dynamic_container<T,
typename std::enable_if<
!std::is_same<T,typename std::decay<T>::type>::value,
>::type
>
: is_dynamic_container<typename std::decay<T>::type>
{};
如果您不介意中间步骤,还有一个更简单、更保守的解决方案。将 is_dynamic_container
重命名为 is_dynamic_container_impl
然后
template<typename T>
using is_dynamic_container =
is_dynamic_container_impl<typename std::decay<T>::type>;
选择适合您的情况。
template<class T>
using is_dynamic_container_with_decay = is_dynamic_container<std::decay_t<T>>;
我制作这些类型特征是为了确定类型是否是动态容器,但最近 运行 当对向量的引用不正确时 return 陷入混乱。
template<typename T>
struct is_dynamic_container
{
static const bool value = false;
};
template<typename T , typename Alloc>
struct is_dynamic_container<std::vector<T , Alloc>>
{
static const bool value = true;
};
我想我需要使用 std::decay
,但我无法确定是否可以像这样而不是在调用站点来完成。
template<typename T , typename Alloc>
struct is_dynamic_container<std::decay<std::vector<T , Alloc>>::type>
{
static const bool value = true;
};
^^这不行。
我只想写 is_dynamic_container<std::vector<int>&>
而不是 is_dynamic_container<std::decay<std::vector<int>&>::type>
。这可能吗?
你可以试试这个:
template<typename T,typename=void>
struct is_dynamic_container
{
static const bool value = false;
};
template<typename T>
struct is_dynamic_container<T,
typename std::enable_if<
!std::is_same<T,typename std::decay<T>::type>::value,
>::type
>
: is_dynamic_container<typename std::decay<T>::type>
{};
如果您不介意中间步骤,还有一个更简单、更保守的解决方案。将 is_dynamic_container
重命名为 is_dynamic_container_impl
然后
template<typename T>
using is_dynamic_container =
is_dynamic_container_impl<typename std::decay<T>::type>;
选择适合您的情况。
template<class T>
using is_dynamic_container_with_decay = is_dynamic_container<std::decay_t<T>>;