2015-04-12 49 views
3

我做了這些類型的特徵,以確定類型是否是一個動態容器,但最近遇到一個混淆,當一個向量的引用沒有返回true時。如何在部分特化類型特徵時使用std :: decay?

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>。那可能嗎?

回答

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

謝謝。接受這個答案,因爲它是最乾淨的解決方案。簡明扼要。 – Jonathan

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_containeris_dynamic_container_impl,然後

template<typename T> 
using is_dynamic_container = 
    is_dynamic_container_impl<typename std::decay<T>::type>; 

選擇無論是在你的情況適合。

+0

由於C++ 14,你可以用'decay_t' – megabyde

+0

@megabyde我知道enable_if_t'和'decay_t'的',但OP標記的問題C++ 11。 –