在部分特化类型特征时如何使用std :: decay?

时间:2015-04-12 07:52:58

标签: c++ templates c++11 typetraits partial-specialization

我制作了这些类型特征来确定该类型是否是一个动态容器,但是当对向量的引用没有返回true时,最近遇到了混乱。

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>。这可能吗?

2 个答案:

答案 0 :(得分:5)

template<class T>
using is_dynamic_container_with_decay = is_dynamic_container<std::decay_t<T>>;

答案 1 :(得分:3)

你可以试试这个:

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>;

根据您的情况选择合适的内容。