1

我只想为T=std::vector<T2>参数(T2是任意类型)进行模板匹配。我可以boost::enable_if在模板参数中使用。如何测试一个类型是否T是 a std::vector

我可以包含T::iterator在我的模板中,以便非容器类型会导致替换失败并且不会被考虑(SFINAE)。但是,这样一来,任何定义的容器都T::iterator将匹配,而不仅仅是std::vector<T2>.

4

3 回答 3

3

这个怎么样:

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 一起使用!

于 2012-02-22T10:20:40.723 回答
3

您可能不需要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 ) { ... }
于 2012-02-22T10:20:50.813 回答
2

你为什么还要为此使用模板?你不能写一个简单的函数吗?

无论如何,这是可能的:

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!:-)

于 2012-02-22T10:19:05.680 回答