pmr*_*pmr 2 c++ templates vector
鉴于:
template<typename T> class A {
B b;
std::vector<T> vec1;
std::vector<T> vec2;
}
Run Code Online (Sandbox Code Playgroud)
我希望B有一个成员函数fill(),它引用那些向量,并根据b中包含的一些信息用值T填充vec2.
这样做的一种方法是为每个可能的参数T重载fill():
fill(const std::vector<float>& a, std::vector<float>& b)
Run Code Online (Sandbox Code Playgroud)
等等,但这意味着很多不必要的重复,因为每个可能的T的操作是相同的.在fill()内部,我可以使用vector :: value_type进行计算,但我不知道如何在这样的情况下声明它它采用各种std :: vector的方式.显而易见的方法是使用带模板的自由函数.有更简单的方法吗?
模板化B.
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;
}
Run Code Online (Sandbox Code Playgroud)
如果您不想模板化B,那么将填充函数模板化:
class B {
template<typename T>
void fill(const std::vector<T>& a, std::vector<T>& b) {}
};
Run Code Online (Sandbox Code Playgroud)
你已经得到了很多答案,但至少在某种程度上我不得不同意这些答案.我的直接反应是,你应该不是通过载体来b::fill的.相反,您应该传递迭代器(或者可能是一对迭代器).其余的大部分是正确的:这仍然意味着fill应该是模板成员函数.当你打电话给它时,你可能想要通过一个std::back_insert_iterator通常获得的std::back_inserter.
你所说的内容部分似乎自相矛盾的是:如果b::fill修改vec1和vec2,他们或许应该不被作为常量引用传递.不可否认,const当应用于容器时,它没有完全正常的含义,但事实仍然是将对const的引用传递给一个函数,该函数的唯一目的显然是修改传递的内容似乎是错误的.
| 归档时间: |
|
| 查看次数: |
7104 次 |
| 最近记录: |