我只想为T=std::vector<T2>
参数(T2
是任意类型)进行模板匹配。我可以boost::enable_if
在模板参数中使用。如何测试一个类型是否T
是 a std::vector
?
我可以包含T::iterator
在我的模板中,以便非容器类型会导致替换失败并且不会被考虑(SFINAE)。但是,这样一来,任何定义的容器都T::iterator
将匹配,而不仅仅是std::vector<T2>
.
我只想为T=std::vector<T2>
参数(T2
是任意类型)进行模板匹配。我可以boost::enable_if
在模板参数中使用。如何测试一个类型是否T
是 a std::vector
?
我可以包含T::iterator
在我的模板中,以便非容器类型会导致替换失败并且不会被考虑(SFINAE)。但是,这样一来,任何定义的容器都T::iterator
将匹配,而不仅仅是std::vector<T2>
.
这个怎么样:
template <class T>
struct is_std_vector { static const bool value=false; };
template <class T>
struct is_std_vector<std::vector<T> > { static const bool value=true; };
与 enable_if 一起使用!
您可能不需要enable_if
,一个简单的部分专业化就足够了:
template <typename T>
struct Type { ... };
// partial specialization for std::vector
template <typename T>
struct Type< std::vector< T > > { ... };
如果你正在处理一个函数模板,你可以简单地提供一个重载:
template <typename T>
void foo( const T & t ) { ... }
// overload for std::vector
template <typename T>
void foo( const std::vector< T > & vec ) { ... }
你为什么还要为此使用模板?你不能写一个简单的函数吗?
无论如何,这是可能的:
template<class T
,class=typename std::enable_if<(
std::is_same<T,std::vector<int>>::value
)>::type
>
void foo(T const& vec)
(这是 C++11:函数模板的默认模板参数 + type_traits + >> 不是移位运算符)
编辑:我刚刚意识到您问题中的 T2 可能不是某种固定类型,而是允许多种向量的占位符。在这种情况下,我建议接受 Luc 的回答。
Viele Grüße nach Österreich!:-)