代码之家  ›  专栏  ›  技术社区  ›  pmr

将任何类型的std::vector传递给函数

  •  2
  • pmr  · 技术社区  · 15 年前

    鉴于:

    template<typename T> class A {  
      B b;
      std::vector<T> vec1;
      std::vector<T> vec2;
    }
    

    我希望b有一个成员函数fill(),它引用向量,并根据b中包含的一些信息用t值填充vec2。
    一种方法是为每个可能的参数t重载fill():

    fill(const std::vector<float>& a, std::vector<float>& b)
    

    等等,但这将意味着大量不必要的重复,因为每个可能的t的操作都是相同的。在fill()中,我可以使用vector::value_类型进行计算,但我不知道如何以这样的方式声明它,它需要各种std::vector。最明显的方法是使用一个带有模板的自由函数。有更简单的方法吗?

    4 回复  |  直到 15 年前
        1
  •  5
  •   Ben Collins    15 年前

    使温度升高

    template<typename T> class B {
      void fill(const std::vector<T>& a, std::vector<T>& b) { }
    };
    
    template<typename T> class A {  
      B<T> b;
      std::vector<T> vec1;
      std::vector<T> vec2;
    }
    

    如果不想将b模板化,则将fill函数模板化:

    class B {
      template<typename T>
      void fill(const std::vector<T>& a, std::vector<T>& b) {}
    };
    
        2
  •  5
  •   Jerry Coffin    15 年前

    你已经得到了很多答案,但我至少在某种程度上不同意它们。我的直接反应是你不应该通过 矢量 b::fill 完全。相反,您应该传递一个迭代器(或者可能是一对迭代器)。剩下的大部分都是对的:这仍然意味着 fill 应该是模板成员函数。当你叫它的时候,你可能想通过 std::back_insert_iterator ,通常用 std::back_inserter .

    不过,你所说的部分内容似乎自相矛盾:如果 乙:填充 修改 vec1 vec2 ,他们可能应该 作为常量的引用传递。无可否认, const 当应用于容器时,并没有它通常的含义,但事实仍然是,将对const的引用传递给一个函数,这个函数的唯一目的显然是修改传递的内容,这似乎是错误的。

        3
  •  4
  •   sbi    15 年前

    模板化 fill :

    class B {
    public:
      template<typename T>
      void fill(const std::vector<T>& a, std::vector<T>& b)
      { /*...*/ }
      //...
    };
    

    (从你的描述可以看出 b 应该是 const std::vector<T>& )

        4
  •  2
  •   Oren S    15 年前

    您可以将b定义为模板类、fill as template函数(在非模板类b中)或使用标准 std::transform / std::copy / std::fill 它已经是模板函数,用于填充向量。
    (全部位于内部 <algorithm> 标题)。