我制作了这些类型特征来确定该类型是否是一个动态容器,但是当对向量的引用没有返回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>
。这可能吗?
答案 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>;
根据您的情况选择合适的内容。