【问题标题】:Templates inside templates. Specializing a template class inside a template function模板内的模板。在模板函数中特化模板类
【发布时间】:2016-07-11 19:45:12
【问题描述】:

在以下示例中,我想使用模板函数 f 获取一个 stl 容器(列表或 unordered_set)。我知道 stl 容器会包含整数。

我尝试使用部分模板模板专业化,但它不起作用。

如何实现我想要的?

上面的代码显然不能编译。

#include <list>
#include <unordered_set>

template <typename T, template C<T>>
C<T> f()
{
    C<T> d;
    d.insert(1);
    return d;
}

int main()
{
    auto l = f<int, std::list<int>>();
    auto s = f<int, std::unordered_set>();

    return 0;
}

谢谢。

【问题讨论】:

    标签: c++ templates stl


    【解决方案1】:

    至少你会遇到一个问题,std::list 不像 std::unordered_set 那样采用 insert。前者需要职位;后者没有。

    除此之外,我可以让它编译和执行(别忘了你需要实例化模板):

    template <typename T, typename C>
    C f()
    {
        C d;
        d.insert(1);
        return d;
    }
    
    template std::unordered_set<int> f<int, std::unordered_set<int>>();
    

    但您将无法以这种方式使用列表。

    这种事情你能接受吗?如果没有,我认为您需要更多地澄清您想要什么的问题。

    【讨论】:

    • 你能解释一下最后一行吗?
    • 代码的最后一行,还是答案的最后一行?
    • 最后一行代码,看不懂
    • 您必须为每种类型实例化一个函数模板。 template std::unordered_set&lt;int&gt; f&lt;int, std::unordered_set&lt;int&gt;&gt;(); 行将 f 的函数模板实例化为 intstd::unordered_set&lt;int&gt; 类型。此规范出现在f 之后和括号之前的尖括号(&lt;&gt;)中。请注意,如果将 std::unordered_set&lt;int&gt; 替换为 C 并将 int 替换为 T ,则会在前两行中获得模板。 -- 顺便说一句,这让我意识到我复制并粘贴了前两行错误,所以我会修复,抱歉。
    • 哦,好的,我明白了,它告诉编译器在T = intC = std::unordered_set 时实例化函数。谢谢。
    【解决方案2】:

    您可以简单地创建一组重载函数,以您需要的特定于容器的方式插入。

    template <typename T>
    void f_impl(std::unordered_set<T> & container)
    {
        container.insert(1);
    }
    
    template <typename T>
    void f_impl(std::list<T> & container)
    {
        container.push_back(1);
    }
    
    template <typename T, template<class...> class C>
    C<T> f()
    {
        C<T> d;
        f_impl(d);
        return d;
    }
    

    那么你可以这样做:

    auto c1 = f<int, std::unordered_set>();
    auto c2 = f<int, std::list>();
    

    让你心满意足。

    【讨论】:

      【解决方案3】:

      谢谢大家。

      这对我有用。我根据你们发布的答案汇总起来。

      我想要的问题要简单得多。我希望能够在模板函数中专门化一个 STL 容器。显然,插入功能是不同的,但我只是删除了它,因为我不需要插入。我只需要创建容器。

      #include <list>
      #include <unordered_set>
      
      template <template <class...> class C>
      C<int> f()
      {
          C<int> d;
          return d;
      }
      
      int main()
      {
          auto l = f<std::list>();
          auto s = f<std::unordered_set>();
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 2015-11-14
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多