我正在实现一个对某些对象的向量进行操作的函数,为简单起见,它计算一个总和。
函数的逻辑独立于它是对象的向量,对象的原始指针还是唯一/弱/共享指针。
如何在不重复代码的情况下以最小的开销为用户完成它?
编辑:
该解决方案适用于不同的指针,但不适用于对象。好吧,也许没有办法解决它,除了在任何地方使用指针并强制用户创建指针的向量,如果他想要使用该函数。至少比其他方式更容易。
如果可能的话,我想保留我的对象类型,因为我很高兴。现在不是玩家,小工具,矩阵或任何有意义的事情的向量,而是我被迫使用T.在这种情况下,我希望有类似template <class T extends MyLovelyClass>
的东西,但那不是C ++ ......
#include <vector>
#include <memory>
class A{
public:
int get(){return 1;}
};
template<typename T, typename Iterator>
int sum(Iterator begin, Iterator end) {
T result = {};
for(auto it = begin; it != end; ++it) {
result += (*it)->get();
}
return result;
}
int main(){
std::vector<A> v(10);
std::vector<A*> w(10);
std::vector<std::shared_ptr<A>> u(10);
for (int i = 0; i < w.size(); i++){
w[i] = new A();
}
for (int i = 0; i < u.size(); i++){
u[i] = std::make_shared<A>();
}
//sum<int>(v.begin(), v.end()); //doesn't work
sum<int>(w.begin(), w.end());
sum<int>(u.begin(), u.end());
}
答案 0 :(得分:0)
您可以使用模板功能实现算法。这里给出了模板函数的示例。
template<typename T>
return_type functionName(vector<T> var) {
// You can do this multiple way, First approach
T sum = T();
for(const auto& it: var) {
sum += it;
}
// 2nd Approach
for(int i = 0; i < var.size(); i++) {
sum += var[i];
}
}
有关模板及其使用的更多详情,请参阅An Idiot's Guide to C++ Templates - Part 1和An Idiot's Guide to C++ Templates - Part 2
答案 1 :(得分:0)
函数的逻辑独立于它是对象的向量,对象的原始指针还是唯一/弱/共享指针。
惯用法是将此类算法包装到模板函数中,该函数采用迭代器模板参数:
template<typename T, typename Iterator>
T sum(Iterator begin, Iterator end) {
T result = {};
for(auto it = begin; it != end; ++it) {
result += *it;
}
return result;
}
以下是使用它的几种方法
std::vector<int> v { 1, 2, 3, 4, 5 };
int sum1 = sum<int>(v.begin(),v.end());
std::array<int, 5> a { 1, 2, 3, 4, 5 };
int sum2 = sum<int>(a.begin(),a.end());
int ra[5] { 1, 2, 3, 4, 5 };
int sum3 = sum<int>(std::begin(ra),std::end(ra));
int* da = new int[5] { 1, 2, 3, 4, 5 };
int sum4 = sum<int>(da,da+5);
请参阅Live Demo。