【问题标题】:Make template function for nested container为嵌套容器制作模板功能
【发布时间】:2015-07-02 00:57:33
【问题描述】:

我正在尝试制作一个通用测试函数,该函数采用列表、集合或向量等容器,并返回嵌套容器:列表列表、集合集合、向量向量。非泛型函数如下所示:

vector<vector<string>> test(vector<string>& in_container)
{
    vector<vector<string>> out_continer;

    // out_continer will be filed using values from in_container

    return out_continer;
}

list<list<int>> test(list<int>& in_container)
{
    list<list<int>> out_continer;

    // out_continer will be filed using values from in_container

    return out_continer;
}

set<set<float>> test(set<float>& in_container)
{
    set<set<float>> out_continer;

    // out_continer will be filed using values from in_container

    return out_continer;
}

但我不知道如何制作一个与这些单独的测试示例等效的模板测试功能。

【问题讨论】:

    标签: c++ templates c++11


    【解决方案1】:

    vectorlist(和deque)具有相同的模板参数集,是普通序列,所以你可以用

    template <typename T, typename U, template <typename, typename> class C>  
    C<C<T, U>, std::allocator<C<T, U>>> test(C<T, U> &in)
    {
      C<C<T, U>, std::allocator<C<T, U>>> out;
      // Fill it here
      return out;
    }
    
    int main() 
    {
      std::vector<int> v;
      std::vector<std::vector<int>> vv = test(v);
    
      std::list<int> l;
      std::list<std::list<int>> ll = test(l);
    }
    

    (代码有点复杂,因为我们必须显式指定外部容器的分配器类型,但它可能可以改进。)

    同时set 是一种不同类型的容器(关联),它可能无论如何都需要一个专用函数。

    【讨论】:

    • 谢谢。你能解释一下这个“模板 class C>”吗?这里发生了什么?我知道普通的模板,但这对我来说似乎是一些黑魔法。或者一些解释这个的教程链接?
    • @batchtest:C++ 中的模板有三种参数:类型参数(如我们熟悉的typename T)、非类型参数(如int N)和模板参数(又名“模板模板参数”) ”)。我模板中的最后一个参数正是第三种参数之一:模板模板参数C 声明为template &lt;typename, typename&gt; class C。此类参数不经常使用(最好避免使用)。你可以在这里阅读:en.cppreference.com/w/cpp/language/…
    【解决方案2】:

    我不认为你可以这样做自动,但你可以设置一个模板功能,如果你指定类型:

    template <typename T>
    T test(typename T::value_type& in_container)
    {
        T out_container;
        return out_container;
    }
    
    int main()
    {
        vector<string> v;
        v.push_back("hello");
        auto w = test<vector<vector<string>>>(v); // w is a vector<vector<string>> now
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2020-12-19
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多