【问题标题】:STL container template parameter containing certain object包含特定对象的 STL 容器模板参数
【发布时间】:2016-03-08 11:07:09
【问题描述】:

我有一个函数f

template <typename T>
void f(T<int> ints)
{ /* */ }

此函数应该采用std::vector&lt;int&gt;std::initializer_list&lt;int&gt; 或任何其他STL 容器,但前提是它包含int

我可以接受其他classes 和int 作为模板参数,但我不希望它接受std::vector&lt;char&gt;std::vector&lt;double&gt;std::list&lt;double&gt; 或类似的东西。

我怎样才能意识到这一点?

【问题讨论】:

    标签: c++ templates stl containers


    【解决方案1】:

    可以使用模板模板参数:

    template <template <typename...> typename T>
    void f(const T<int>& ints)
    { /* */ }
    

    但我建议改用容器的value_type 类型成员。这将避免匹配以int作为模板参数的其他模板。

    //using std::enable_if_t
    template <typename T>
    std::enable_if_t<std::is_same<typename T::value_type, int>::value> 
    f(const T& ints)
    { /* */ }
    
    //or static_assert
    template <typename T>
    void f(const T& ints) { 
        static_assert(std::is_same<typename T::value_type, int>::value,
                      "T must be a container of ints"); 
        //...
    }
    

    【讨论】:

    • 选择一种方法而不是另一种方法是否有价值(std::enable_if_tstatic_assert)?
    • @hgiesel std::enable_if 方法允许您在版本无效时选择其他重载,并在声明中记录您的类型要求。 static_assert 方法提供了更好的错误消息,并且不会混淆您的声明。
    【解决方案2】:

    学究式地说,这是一个函数模板,从中可以实例化一个函数。

    一种解决方案是检测value_type 哪些标准容器提供:

    template<class T>
    typename std::enable_if<std::is_same<int, typename T::value_type>::value>::type
    void f(T const& ints);
    

    这不适用于内置数组,因为它们没有嵌入 value_type。对于内置数组,您可以添加重载:

    template<size_t N>
    void f(int const(&ints)[N]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      相关资源
      最近更新 更多