C++ 仅为某些std::vector启用模板<;T2>;类型

C++ 仅为某些std::vector启用模板<;T2>;类型,c++,templates,template-specialization,template-meta-programming,C++,Templates,Template Specialization,Template Meta Programming,我只想让模板匹配T=std::vector参数(T2是任意类型)。我可以在模板参数中使用boost::enable_if。如何测试类型T是否为std::vector 我可以在模板中包含T::iterator,这样非容器类型将导致替换失败,并且不会被考虑(SFINAE)。但是,通过这种方式,任何定义T::iterator的容器都将匹配,而不仅仅是std::vector为什么要使用模板呢?你不能只写一个普通函数吗 无论如何,有可能: template<class T ,class=type

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


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

为什么要使用模板呢?你不能只写一个普通函数吗

无论如何,有可能:

template<class T
  ,class=typename std::enable_if<(
    std::is_same<T,std::vector<int>>::value
  )>::type
>
void foo(T const& vec)
模板
无效foo(T const&vec)
(这是C++11:函数模板的默认模板参数+类型\u traits+>>不是移位运算符)

编辑:我刚刚意识到你问题中的T2可能不是固定类型,而是一个允许多种向量的占位符。在这种情况下,我建议接受吕克的回答


维勒·格吕埃·纳赫·斯特雷希!:-)

你为什么要用一个模板呢?你不能只写一个普通函数吗

无论如何,有可能:

template<class T
  ,class=typename std::enable_if<(
    std::is_same<T,std::vector<int>>::value
  )>::type
>
void foo(T const& vec)
模板
无效foo(T const&vec)
(这是C++11:函数模板的默认模板参数+类型\u traits+>>不是移位运算符)

编辑:我刚刚意识到你问题中的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; };
模板
结构是_std_vector{static const bool value=false;};
样板
结构是_std_vector{static const bool value=true;};
与enable_if一起使用

这个怎么样:

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; };
模板
结构是_std_vector{static const bool value=false;};
样板
结构是_std_vector{static const bool value=true;};

与enable_if一起使用

您可能不需要
启用\u如果
,简单的部分专门化就足够了:

template <typename T>
struct Type { ... };

// partial specialization for std::vector
template <typename T>
struct Type< std::vector< T > > { ... };
模板
结构类型{…};
//std::vector的部分特殊化
样板
结构类型{…};
如果要处理函数模板,只需提供一个重载:

template <typename T>
void foo( const T & t ) { ... }

// overload for std::vector
template <typename T>
void foo( const std::vector< T > & vec ) { ... }
模板
void foo(const T&T){…}
//std::vector的重载
样板
void foo(const std::vector&vec){…}

您可能不需要启用
如果
,简单的部分专门化就足够了:

template <typename T>
struct Type { ... };

// partial specialization for std::vector
template <typename T>
struct Type< std::vector< T > > { ... };
模板
结构类型{…};
//std::vector的部分特殊化
样板
结构类型{…};
如果要处理函数模板,只需提供一个重载:

template <typename T>
void foo( const T & t ) { ... }

// overload for std::vector
template <typename T>
void foo( const std::vector< T > & vec ) { ... }
模板
void foo(const T&T){…}
//std::vector的重载
样板
void foo(const std::vector&vec){…}

+1这很有道理。我想我误解了这个问题。我认为T2是某种固定类型。谢谢,我不确定std::vector的重载是否更可取。+1这很有意义。我想我误解了这个问题。我认为T2是某种固定类型。谢谢,我不确定std::vector的重载是否更可取。