【问题标题】:Function templates for arbitrary STL containers containing arbitrary types包含任意类型的任意 STL 容器的函数模板
【发布时间】:2010-05-18 18:43:45
【问题描述】:

我有一个任意 STL 容器 C,其中包含任意类型 T 的元素。我想创建一个 std::vector,它具有所有元素的副本。最干净的方法是什么?

template <typename C>
void myfunction(C container){

     /*Derive the type T of elements within the container*/

     std::vector<T> mystack;

    /* Iterate over container and push_back() the elements into mystack*/
} 

【问题讨论】:

    标签: c++ templates stl generic-programming


    【解决方案1】:

    vectorset 这样的STL 结构应该包含value_type 类型,该类型定义为T

    std::vector<typename C::value_type> mystack;
    

    顺便说一句,您不需要自己迭代容器。只需使用

    template <typename C>
    void myfunction(const C& container){
      std::vector<typename C::value_type> mystack(container.begin(), container.end());
      ...
    }
    

    【讨论】:

    • 以为我会在 C++11 中遇到这个问题。新的“auto”关键字可以在这里工作吗?我没有太多机会玩它。
    • @ChadBrewbaker:不。decltype 可以,但这并不比typename C::value_type 简单。
    【解决方案2】:

    对于容器,Kenny 给出了正确的解决方案。然而,C++ 中的许多函数都采用迭代器对而不是容器……同样的逻辑也可以应用在这里。迭代器使用iterator_traits 提供有关其相关类型的信息:

    template <typename It>
    void myfunction(It start, It end) {
        // Get value for iterator:
    
        typedef typename std::iterator_traits<It>::value_type T;
    
        // Do something, e.g. calculate the minimum:
    
        T min_value = *std::min_element(start, end);
    }
    

    顺便说一下,typenametypedef 中是必需的,因为value_type 是所谓的依赖 类型,即它取决于模板参数的性质和C++ 编译器在这种情况下,它自己无法确定它指的是类型名称(而不是静态方法或变量)。

    【讨论】:

    • 这是对肯尼回答的一个很好的补充,尽管如果你不命名一个指向 一个通过最后一个有效元素的迭代器,我会对我的投票感觉更好与检索最后一个有效元素的通用容器成员函数相同。这很容易引起混淆。
    • @sbi: D'oh! 我在自己的代码中一直使用这种表示法多年来,从未注意到它的冲突如此严重使用 STL。坏坏坏坏。 :-(
    • 我使用firstlast,就像 STL 算法一样。您必须处理“last”是范围 的最后一个迭代器,而不是指向范围 in 的最后一个元素的迭代器。
    • @Konrad:我赞赏你对你的代码的批评的反应。
    • @Steve: last 也不是很理想,但至少它并没有被一个微妙但重要的不同的含义所覆盖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2013-08-12
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多