在我们的项目中,我们仍未成功迁移到支持 C++11 的编译器,因此对于容器对象的 type_traits,我不得不编写一个简单的 boost 风格帮助程序:
template<typename Cont> struct is_std_container: boost::false_type {};
template<typename T, typename A>
struct is_std_container<std::vector<T,A> >: boost::true_type {};
template<typename T, typename A>
struct is_std_container<std::list<T,A> >: boost::true_type {};
template<typename T, typename A>
struct is_std_container<std::deque<T,A> >: boost::true_type {};
template<typename K, typename C, typename A>
struct is_std_container<std::set<K,C,A> >: boost::true_type {};
template<typename K, typename T, typename C, typename A>
struct is_std_container<std::map<K,T,C,A> >: boost::true_type {};
template<typename Cont> struct is_std_sequence: boost::false_type {};
template<typename T, typename A>
struct is_std_sequence<std::vector<T,A> >: boost::true_type {};
template<typename T, typename A>
struct is_std_sequence<std::list<T,A> >: boost::true_type {};
template<typename T, typename A>
struct is_std_sequence<std::deque<T,A> >: boost::true_type {};
is_container
结构体,都使用void
作为第二个参数。经过测试,似乎无论类型如何,只要是相同类型:template<typename T, typename _ = int>
和is_container_helper<...>, int>
,它就能正常工作。为什么?如果我们使用void
和int
或int
和void
,为什么它不起作用? - Maxime Recuerdastd::void_t
,你可以摆脱std::conditional_t
吗? - Marek Rstd::void_t<...>
中不起作用:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64395) - Nevermore