部分特化类型特征时如何使用 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>>;