【问题标题】:Enable template only for some std::vector<T2> type仅为某些 std::vector<T2> 类型启用模板
【发布时间】:2012-02-22 10:11:30
【问题描述】:

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

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

【问题讨论】:

    标签: c++ templates template-specialization template-meta-programming


    【解决方案1】:

    你可能不需要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 ) { ... }
    

    【讨论】:

    • +1 这很有意义。我想我误解了这个问题。我以为 T2 是某种固定类型。
    • 谢谢,我不确定是否首选 std::vector 的重载。
    【解决方案2】:

    这个怎么样:

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

    【讨论】:

      【解决方案3】:

      您为什么还要为此使用模板?就不能写一个普通的函数吗?

      无论如何,这是可能的:

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

      【讨论】:

        猜你喜欢
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多