与宏的模板功能 - 在传染媒介积累

URL*_*L87 2 c++ macros templates vector c-preprocessor

我想创建一个能够vector<int>遍历所有元素的函数,并根据我选择的特定运算符"求和"它们.

例如,v1 = [3,6,7]这样我就可以通过这个函数计算- 3+6+73-6-73*6*7等.

为此我做了 -

#include <iostream>
#include <vector>

using namespace std;

#define     OPERATOR(X,Y,OP)  X #OP Y

template<T>
int allVectorWithOperator(vector<int> &myVector, T) {
    vector<int>::iterator it;
    vector<int>::iterator oneBeforeFinal;
    oneBeforeFinal = myVector.end();
    oneBeforeFinal -= 2;
    int sum = 0;
    for (it = myVector.begin(); it <= oneBeforeFinal; it++) {
        sum = OPERATOR(*(it),*(it+1),T);
    }
    return sum;

}

int main() {
    vector<int> myVector;
    myVector.push_back(3);
    myVector.push_back(6);
    myVector.push_back(7);
cout << "run over all the vector with * is :" << allVectorWithOperator(myVector,*)<<endl;
// here I want to get 3*6*7    

}
Run Code Online (Sandbox Code Playgroud)

在这种模板的情况下,我不能很好地控制,因为你可以看到这段代码不起作用,但我想你明白我的目标是什么.如何修复它才能正常工作?

编辑:

根据我得到的2个答案,我将代码部分更改为 -

#include <iostream>
#include <vector>
#include <numeric>

using namespace std;

template<typename T>
int allVectorWhitOperator(vector<int> &myVector, const T& func) {
    int sum = std::accumulate(myVector.begin(), myVector.end(), 1, func);
    return sum;

}

int main() {
    vector<int> myVector;
    myVector.push_back(3);
    myVector.push_back(4);
    myVector.push_back(6);
    cout << "accumulate the vector with * is :"
            << allVectorWhitOperator(myVector, std::multiplies<int>()) << endl;

}
Run Code Online (Sandbox Code Playgroud)

它工作正常!的确,我got accumulate the vector with * is :72

Bo *_*son 7

标准库已经有了操作.<algorithm><numeric>

您可以使用

int sum = std::accumulate(MyVector.begin(), MyVector.end(), 0);
Run Code Online (Sandbox Code Playgroud)

添加所有元素.

如果要计算产品(而不是使用默认值operator+),则可以传递其他参数

int product = std::accumulate(MyVector.begin(), MyVector.end(), 1,
                              std::multiplies<int>());
Run Code Online (Sandbox Code Playgroud)